Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.coderising.myknowledgepoint.reflect;

/**
* Created by thomas_young on 23/9/2017.
*/
public class Derived extends Base {
}
Original file line number Diff line number Diff line change
@@ -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");
}

}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
public class Context {

private static final ThreadLocal<String> txThreadLocal
= new ThreadLocal<String>();
= new ThreadLocal<>();

public static void setTransactionID(String txID) {
txThreadLocal.set(txID);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Integer> 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
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.coderising.myknowledgepoint.threadlocal;

public class TransactionManager {
private static final ThreadLocal<String> context = new ThreadLocal<String>();
private static final ThreadLocal<String> context = new ThreadLocal<>();

public static void startTransaction() {
// logic to start a transaction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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和银行服务器合作
用户可以选定交易,提供相关信息,交易完成后,返回主菜单

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" version="7.4.9" editor="www.draw.io" type="device"><diagram id="84536f3e-bc4a-3da0-3d03-4334d4ce36f1" name="Page-1">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</diagram></mxfile>
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ public abstract class BankProxy {
protected NetworkClient networkClient;

public abstract boolean verify(String account, String password);

/**
* 交易发送到银行做处理
* @param transaction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@
---------------------------------------

### 改进点
1. TestRunner没有使用反射来寻找suite方法
1. TestRunner没有使用反射来寻找suite方法(done)
2. junit-v4版本后续有空可以实现
3. 两个装饰器的异常判断不足, 可能意外跳出
Original file line number Diff line number Diff line change
@@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down