diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/ATest.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/ATest.java new file mode 100644 index 0000000000..12fb8a15f4 --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/ATest.java @@ -0,0 +1,11 @@ +package com.coderising.myknowledgepoint; + +/** + * Created by thomas_young on 31/12/2017. + */ +public class ATest { + public static void main(String[] args) { + System.out.println(ATest.class.getClassLoader().getSystemClassLoader()); + System.out.println(ClassLoader.getSystemClassLoader()); + } +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/concurrency/EscapeDemo.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/concurrency/EscapeDemo.java new file mode 100644 index 0000000000..49d99f1fe2 --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/concurrency/EscapeDemo.java @@ -0,0 +1,43 @@ +package com.coderising.myknowledgepoint.concurrency; + +/** + * Created by thomas_young on 10/11/2017. + */ +class Unsafe { + public int foo = 15; + public Unsafe(Unsafe[] leak, int loop) { + leak[0] = this; // Unsafe publication + // Make the "window of vulnerability" large + for (long l = 1; l < loop /* very large */ ; l++) { + l++; + } + foo = 42; + } +} + +/** + * 修改LOOP,会发现leak可能在Unsafe还未初始化前把状态泄露出去 + * 根本原因是Thread中Unsafe对象还未运行结束,主线程中的leak就已经在使用该对象的状态了 + */ +public class EscapeDemo { + public static void main(String[] args) throws InterruptedException { + final int LOOP = 1; // loop=100000或1 + final Unsafe[] leak = new Unsafe[1]; + new Thread(() -> { + Thread.yield(); // (or sleep for a bit) + new Unsafe(leak, LOOP); + }).start(); + + while (true) { + + if (leak[0] != null) { + if (leak[0].foo == 42) { + System.err.println("OK"); + } else { + System.err.println("OUCH!"); + } + System.exit(0); + } + } + } +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Base.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Base.java new file mode 100644 index 0000000000..cba2c09767 --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Base.java @@ -0,0 +1,12 @@ +package com.coderising.myknowledgepoint.reflect; + +/** + * Created by thomas_young on 23/9/2017. + */ +public class Base { + static int num = 1; + + static { + System.out.println("Base " + num); + } +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Derived.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Derived.java new file mode 100644 index 0000000000..9add3f5add --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Derived.java @@ -0,0 +1,7 @@ +package com.coderising.myknowledgepoint.reflect; + +/** + * Created by thomas_young on 23/9/2017. + */ +public class Derived extends Base { +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Main.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Main.java new file mode 100644 index 0000000000..e7a1d53151 --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Main.java @@ -0,0 +1,68 @@ +package com.coderising.myknowledgepoint.reflect; + +import com.coderising.myknowledgepoint.reflect.proxy.DynamicProxyHandler; +import com.coderising.myknowledgepoint.reflect.proxy.Interface; +import com.coderising.myknowledgepoint.reflect.proxy.RealObject; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * Created by thomas_young on 23/9/2017. + */ +public class Main { + public static void main(String[] args) throws Exception { +// test1(); +// test2(); +// test3(); + test4(); + } + + private static void test3() throws Exception { + Person person = new Person("luoxn28", 23); + Class clazz = person.getClass(); + + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + String key = field.getName(); + PropertyDescriptor descriptor = new PropertyDescriptor(key, clazz); + Method method = descriptor.getReadMethod(); + Object value = method.invoke(person); + + System.out.println(key + ":" + value); + + } + } + + private static void test1() throws ClassNotFoundException { + // 不会初始化静态块 + Class clazz1 = Base.class; + System.out.println("------"); + // 会初始化 + Class clazz2 = Class.forName("com.coderising.myknowledgepoint.reflect.Base"); + } + + public static void test2() { + Base base = new Derived(); + if (base instanceof Derived) { + // 这里可以向下转换了 + System.out.println("ok"); + } + else { + System.out.println("not ok"); + } + } + + public static void test4() { + RealObject real = new RealObject(); + Interface proxy = (Interface) Proxy.newProxyInstance( + Interface.class.getClassLoader(), new Class[] {Interface.class}, + new DynamicProxyHandler(real)); + + proxy.doSomething(); + proxy.somethingElse("luoxn28"); + } + +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Person.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Person.java new file mode 100644 index 0000000000..33d05e348f --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/Person.java @@ -0,0 +1,33 @@ +package com.coderising.myknowledgepoint.reflect; + +import java.io.Serializable; + +/** + * Created by thomas_young on 23/9/2017. + */ +public class Person implements Serializable { + + private String name; + private int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + public void setName(String name) { + this.name = name; + } + + public void setAge(int age) { + this.age = age; + } +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/DynamicProxyHandler.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/DynamicProxyHandler.java new file mode 100644 index 0000000000..c1885ce1a8 --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/DynamicProxyHandler.java @@ -0,0 +1,24 @@ +package com.coderising.myknowledgepoint.reflect.proxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Created by thomas_young on 23/9/2017. + * http://www.cnblogs.com/luoxn28/p/5686794.html + * 调用处理器类 + */ +public class DynamicProxyHandler implements InvocationHandler { + private Object proxyed; + + public DynamicProxyHandler(Object proxyed) { + this.proxyed = proxyed; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + System.out.println("代理工作了."); + return method.invoke(proxyed, args); + } +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/Interface.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/Interface.java new file mode 100644 index 0000000000..a5669880ee --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/Interface.java @@ -0,0 +1,9 @@ +package com.coderising.myknowledgepoint.reflect.proxy; + +/** + * Created by thomas_young on 23/9/2017. + */ +public interface Interface { + void doSomething(); + void somethingElse(String arg); +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/RealObject.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/RealObject.java new file mode 100644 index 0000000000..e0f71bd942 --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/reflect/proxy/RealObject.java @@ -0,0 +1,17 @@ +package com.coderising.myknowledgepoint.reflect.proxy; + +/** + * Created by thomas_young on 23/9/2017. + */ +public class RealObject implements Interface { + + @Override + public void doSomething() { + System.out.println("doSomething."); + } + + @Override + public void somethingElse(String arg) { + System.out.println("somethingElse " + arg); + } +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java index a9b18ddaf4..60812185df 100644 --- a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java @@ -6,7 +6,7 @@ public class Context { private static final ThreadLocal txThreadLocal - = new ThreadLocal(); + = new ThreadLocal<>(); public static void setTransactionID(String txID) { txThreadLocal.set(txID); diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/ThreadLocalExample.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/ThreadLocalExample.java new file mode 100644 index 0000000000..360b7303ee --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/ThreadLocalExample.java @@ -0,0 +1,42 @@ +package com.coderising.myknowledgepoint.threadlocal; + +/** + * Created by thomas_young on 22/11/2017. + * http://tutorials.jenkov.com/java-concurrency/threadlocal.html + */ +public class ThreadLocalExample { + + + public static class MyRunnable implements Runnable { + + private ThreadLocal threadLocal = + new ThreadLocal<>(); + + @Override + public void run() { + threadLocal.set( (int) (Math.random() * 100D) ); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + } + + System.out.println(threadLocal.get()); + } + } + + + public static void main(String[] args) throws InterruptedException { + MyRunnable sharedRunnableInstance = new MyRunnable(); + + Thread thread1 = new Thread(sharedRunnableInstance); + Thread thread2 = new Thread(sharedRunnableInstance); + + thread1.start(); + thread2.start(); + + thread1.join(); //wait for thread 1 to terminate + thread2.join(); //wait for thread 2 to terminate + } + +} diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java index 2cf9170578..637131bad7 100644 --- a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java +++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java @@ -1,7 +1,7 @@ package com.coderising.myknowledgepoint.threadlocal; public class TransactionManager { - private static final ThreadLocal context = new ThreadLocal(); + private static final ThreadLocal context = new ThreadLocal<>(); public static void startTransaction() { // logic to start a transaction diff --git a/students/812350401/src/main/java/com/coderising/myood/atmSimulation/README.md b/students/812350401/src/main/java/com/coderising/myood/atmSimulation/README.md index 50f8c65813..c107c67b0b 100644 --- a/students/812350401/src/main/java/com/coderising/myood/atmSimulation/README.md +++ b/students/812350401/src/main/java/com/coderising/myood/atmSimulation/README.md @@ -13,10 +13,10 @@ https://github.com/onlyliuxin/coding2017/pull/512 1. 存款 如果选择了存款交易,ATM要求用户输入存款的金额,然后在存钞口放入钞票 2. 取款 -如果选择了取款交易,ATM要求用户输入提取的金额,如果账户余额足够,并且ATM的现金足够,从吐钞口吐出相应的钞票。 +3. 如果选择了取款交易,ATM要求用户输入提取的金额,如果账户余额足够,并且ATM的现金足够,从吐钞口吐出相应的钞票。 转账 -3. 如果选择了转账,ATM要求用户输入转入的账号,如果余额足够, 就会执行转账交易 -查看余额 +如果选择了转账,ATM要求用户输入转入的账号,如果余额足够, 就会执行转账交易 +4. 查看余额 如果选择了查询余额,ATM则显示账号的的余额所有的交易都是ATM和银行服务器合作 用户可以选定交易,提供相关信息,交易完成后,返回主菜单 diff --git a/students/812350401/src/main/java/com/coderising/myood/atmSimulation/UML.png b/students/812350401/src/main/java/com/coderising/myood/atmSimulation/UML.png new file mode 100644 index 0000000000..6e34377342 Binary files /dev/null and b/students/812350401/src/main/java/com/coderising/myood/atmSimulation/UML.png differ diff --git a/students/812350401/src/main/java/com/coderising/myood/atmSimulation/UML.xml b/students/812350401/src/main/java/com/coderising/myood/atmSimulation/UML.xml new file mode 100644 index 0000000000..c7f312b0a7 --- /dev/null +++ b/students/812350401/src/main/java/com/coderising/myood/atmSimulation/UML.xml @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/students/812350401/src/main/java/com/coderising/myood/atmSimulation/model/BankProxy.java b/students/812350401/src/main/java/com/coderising/myood/atmSimulation/model/BankProxy.java index bd1ae67ee5..b42bed6767 100644 --- a/students/812350401/src/main/java/com/coderising/myood/atmSimulation/model/BankProxy.java +++ b/students/812350401/src/main/java/com/coderising/myood/atmSimulation/model/BankProxy.java @@ -9,7 +9,6 @@ public abstract class BankProxy { protected NetworkClient networkClient; public abstract boolean verify(String account, String password); - /** * 交易发送到银行做处理 * @param transaction diff --git a/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/README.md b/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/README.md index db5ad14684..1eccff64dd 100644 --- a/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/README.md +++ b/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/README.md @@ -13,6 +13,6 @@ --------------------------------------- ### 改进点 -1. TestRunner没有使用反射来寻找suite方法 +1. TestRunner没有使用反射来寻找suite方法(done) 2. junit-v4版本后续有空可以实现 3. 两个装饰器的异常判断不足, 可能意外跳出 \ No newline at end of file diff --git a/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/TestRunner.java b/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/TestRunner.java index 12a4fd755d..0cddfbb8f1 100644 --- a/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/TestRunner.java +++ b/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/TestRunner.java @@ -1,29 +1,32 @@ package com.coderising.myood.litejunit.v2; - -import com.coderising.myood.litejunit.v2.example_test.AllTest; - import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Iterator; /** * Created by thomas_young on 21/8/2017. */ public class TestRunner implements TestListener { - PrintStream writer = System.out; + private PrintStream writer = System.out; + private static final String SUITE = "suite"; - public static void main(String[] args) { + public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { TestRunner testRunner = new TestRunner(); TestResult tr = new TestResult(); - tr.addListener(testRunner); - Test testAll = AllTest.suite(); // TODO: 17/9/2017 后续要用反射实现这一步 - testRunner.tryTest(testAll, tr); + tr.addListener(testRunner); // 添加listener + String className = "com.coderising.myood.litejunit.v2.example_test.AllTest"; + Class caseClazz = Class.forName(className); + Method suiteMethod = caseClazz.getMethod(SUITE, new Class[0]); + Test suite = (Test) suiteMethod.invoke(null); + testRunner.tryTest(suite, tr); } - private void tryTest(Test test, TestResult tr) { - test.run(tr); + private void tryTest(Test suite, TestResult tr) { + suite.run(tr); System.out.println(); print(tr); } diff --git a/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/TestSuite.java b/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/TestSuite.java index 63a2c46912..1048483c28 100644 --- a/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/TestSuite.java +++ b/students/812350401/src/main/java/com/coderising/myood/litejunit/v2/TestSuite.java @@ -30,7 +30,7 @@ public TestSuite(String name) { this.name = name; } - // 把某个测试类中的所有pulic的test方法构造成对象,塞入tests + // 把某个测试类中的所有public的test方法构造成对象,塞入tests public TestSuite(final Class theClass) { this.name = theClass.getName(); Constructor constructor = null;