From efe56256e7f4f0766f8f702d6ea9be689091bc8a Mon Sep 17 00:00:00 2001
From: fuzhengwei <184172133@qq.com>
Date: Sun, 24 May 2020 13:20:10 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E5=82=85=E5=93=A5=20|=20=E9=87=8D?=
=?UTF-8?q?=E5=AD=A6=20Java=20=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F?=
=?UTF-8?q?=EF=BC=9A=E5=AE=9E=E6=88=98=E6=8A=BD=E8=B1=A1=E5=B7=A5=E5=8E=82?=
=?UTF-8?q?=E6=A8=A1=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 2 +
itstack-demo-design-2-00/pom.xml | 15 ++
.../org/itstack/demo/design/CacheService.java | 15 ++
.../org/itstack/demo/design/RedisUtils.java | 36 ++++
.../demo/design/impl/CacheServiceImpl.java | 28 +++
.../org/itstack/demo/design/matter/EGM.java | 35 ++++
.../org/itstack/demo/design/matter/IIR.java | 36 ++++
itstack-demo-design-2-01/pom.xml | 22 +++
.../org/itstack/demo/design/CacheService.java | 15 ++
.../demo/design/impl/CacheServiceImpl.java | 77 ++++++++
.../org/itstack/demo/design/test/ApiTest.java | 20 ++
itstack-demo-design-2-02/pom.xml | 22 +++
.../org/itstack/demo/desgin/CacheService.java | 15 ++
.../demo/desgin/factory/ICacheAdapter.java | 15 ++
.../desgin/factory/JDKInvocationHandler.java | 20 ++
.../itstack/demo/desgin/factory/JDKProxy.java | 15 ++
.../desgin/factory/impl/EGMCacheAdapter.java | 27 +++
.../desgin/factory/impl/IIRCacheAdapter.java | 28 +++
.../demo/desgin/impl/CacheServiceImpl.java | 28 +++
.../demo/desgin/util/ClassLoaderUtils.java | 186 ++++++++++++++++++
.../org/itstack/demo/desgin/test/ApiTest.java | 27 +++
pom.xml | 57 ++++++
22 files changed, 741 insertions(+)
create mode 100644 itstack-demo-design-2-00/pom.xml
create mode 100755 itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/CacheService.java
create mode 100755 itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/RedisUtils.java
create mode 100755 itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/impl/CacheServiceImpl.java
create mode 100755 itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/matter/EGM.java
create mode 100755 itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/matter/IIR.java
create mode 100755 itstack-demo-design-2-01/pom.xml
create mode 100755 itstack-demo-design-2-01/src/main/java/org/itstack/demo/design/CacheService.java
create mode 100755 itstack-demo-design-2-01/src/main/java/org/itstack/demo/design/impl/CacheServiceImpl.java
create mode 100755 itstack-demo-design-2-01/src/test/java/org/itstack/demo/design/test/ApiTest.java
create mode 100755 itstack-demo-design-2-02/pom.xml
create mode 100755 itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/CacheService.java
create mode 100755 itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/ICacheAdapter.java
create mode 100755 itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKInvocationHandler.java
create mode 100755 itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKProxy.java
create mode 100755 itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/impl/EGMCacheAdapter.java
create mode 100755 itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/impl/IIRCacheAdapter.java
create mode 100755 itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/impl/CacheServiceImpl.java
create mode 100755 itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/util/ClassLoaderUtils.java
create mode 100755 itstack-demo-design-2-02/src/test/java/org/itstack/demo/desgin/test/ApiTest.java
create mode 100755 pom.xml
diff --git a/.gitignore b/.gitignore
index f39f98c..6ba78a6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
/itstack-demo-design-1-00/itstack-demo-design-1-00.iml
/itstack-demo-design-1-01/itstack-demo-design-1-01.iml
/itstack-demo-design-1-02/itstack-demo-design-1-02.iml
+/itstack-demo-design-2-00/itstack-demo-design-2-00.iml
+/itstack-demo-design-2-02/itstack-demo-design-2-02.iml
diff --git a/itstack-demo-design-2-00/pom.xml b/itstack-demo-design-2-00/pom.xml
new file mode 100644
index 0000000..67c50ad
--- /dev/null
+++ b/itstack-demo-design-2-00/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ itstack-demo-design
+ org.itstack
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ itstack-demo-design-2-00
+
+
+
\ No newline at end of file
diff --git a/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/CacheService.java b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/CacheService.java
new file mode 100755
index 0000000..2bd4cf6
--- /dev/null
+++ b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/CacheService.java
@@ -0,0 +1,15 @@
+package org.itstack.demo.design;
+
+import java.util.concurrent.TimeUnit;
+
+public interface CacheService {
+
+ String get(final String key);
+
+ void set(String key, String value);
+
+ void set(String key, String value, long timeout, TimeUnit timeUnit);
+
+ void del(String key);
+
+}
diff --git a/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/RedisUtils.java b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/RedisUtils.java
new file mode 100755
index 0000000..33b0e05
--- /dev/null
+++ b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/RedisUtils.java
@@ -0,0 +1,36 @@
+package org.itstack.demo.design;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+public class RedisUtils {
+
+ private Logger logger = LoggerFactory.getLogger(RedisUtils.class);
+
+ private Map dataMap = new ConcurrentHashMap();
+
+ public String get(String key) {
+ logger.info("Redis获取数据 key:{}", key);
+ return dataMap.get(key);
+ }
+
+ public void set(String key, String value) {
+ logger.info("Redis写入数据 key:{} val:{}", key, value);
+ dataMap.put(key, value);
+ }
+
+ public void set(String key, String value, long timeout, TimeUnit timeUnit) {
+ logger.info("Redis写入数据 key:{} val:{} timeout:{} timeUnit:{}", key, value, timeout, timeUnit.toString());
+ dataMap.put(key, value);
+ }
+
+ public void del(String key) {
+ logger.info("Redis删除数据 key:{}", key);
+ dataMap.remove(key);
+ }
+
+}
diff --git a/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/impl/CacheServiceImpl.java b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/impl/CacheServiceImpl.java
new file mode 100755
index 0000000..1a44ec6
--- /dev/null
+++ b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/impl/CacheServiceImpl.java
@@ -0,0 +1,28 @@
+package org.itstack.demo.design.impl;
+
+import org.itstack.demo.design.CacheService;
+import org.itstack.demo.design.RedisUtils;
+
+import java.util.concurrent.TimeUnit;
+
+public class CacheServiceImpl implements CacheService {
+
+ private RedisUtils redisUtils = new RedisUtils();
+
+ public String get(String key) {
+ return redisUtils.get(key);
+ }
+
+ public void set(String key, String value) {
+ redisUtils.set(key, value);
+ }
+
+ public void set(String key, String value, long timeout, TimeUnit timeUnit) {
+ redisUtils.set(key, value, timeout, timeUnit);
+ }
+
+ public void del(String key) {
+ redisUtils.del(key);
+ }
+
+}
diff --git a/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/matter/EGM.java b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/matter/EGM.java
new file mode 100755
index 0000000..5701ca8
--- /dev/null
+++ b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/matter/EGM.java
@@ -0,0 +1,35 @@
+package org.itstack.demo.design.matter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+public class EGM {
+
+ private Logger logger = LoggerFactory.getLogger(EGM.class);
+
+ private Map dataMap = new ConcurrentHashMap();
+
+ public String gain(String key) {
+ logger.info("EGM获取数据 key:{}", key);
+ return dataMap.get(key);
+ }
+
+ public void set(String key, String value) {
+ logger.info("EGM写入数据 key:{} val:{}", key, value);
+ dataMap.put(key, value);
+ }
+
+ public void setEx(String key, String value, long timeout, TimeUnit timeUnit) {
+ logger.info("EGM写入数据 key:{} val:{} timeout:{} timeUnit:{}", key, value, timeout, timeUnit.toString());
+ dataMap.put(key, value);
+ }
+
+ public void delete(String key) {
+ logger.info("EGM删除数据 key:{}", key);
+ dataMap.remove(key);
+ }
+}
diff --git a/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/matter/IIR.java b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/matter/IIR.java
new file mode 100755
index 0000000..bda4de4
--- /dev/null
+++ b/itstack-demo-design-2-00/src/main/java/org/itstack/demo/design/matter/IIR.java
@@ -0,0 +1,36 @@
+package org.itstack.demo.design.matter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+public class IIR {
+
+ private Logger logger = LoggerFactory.getLogger(IIR.class);
+
+ private Map dataMap = new ConcurrentHashMap();
+
+ public String get(String key) {
+ logger.info("IIR获取数据 key:{}", key);
+ return dataMap.get(key);
+ }
+
+ public void set(String key, String value) {
+ logger.info("IIR写入数据 key:{} val:{}", key, value);
+ dataMap.put(key, value);
+ }
+
+ public void setExpire(String key, String value, long timeout, TimeUnit timeUnit) {
+ logger.info("IIR写入数据 key:{} val:{} timeout:{} timeUnit:{}", key, value, timeout, timeUnit.toString());
+ dataMap.put(key, value);
+ }
+
+ public void del(String key) {
+ logger.info("IIR删除数据 key:{}", key);
+ dataMap.remove(key);
+ }
+
+}
diff --git a/itstack-demo-design-2-01/pom.xml b/itstack-demo-design-2-01/pom.xml
new file mode 100755
index 0000000..1325e9d
--- /dev/null
+++ b/itstack-demo-design-2-01/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ itstack-demo-design
+ org.itstack
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ itstack-demo-design-2-01
+
+
+
+ org.itstack
+ itstack-demo-design-2-00
+ 1.0-SNAPSHOT
+
+
+
+
\ No newline at end of file
diff --git a/itstack-demo-design-2-01/src/main/java/org/itstack/demo/design/CacheService.java b/itstack-demo-design-2-01/src/main/java/org/itstack/demo/design/CacheService.java
new file mode 100755
index 0000000..60c7dbf
--- /dev/null
+++ b/itstack-demo-design-2-01/src/main/java/org/itstack/demo/design/CacheService.java
@@ -0,0 +1,15 @@
+package org.itstack.demo.design;
+
+import java.util.concurrent.TimeUnit;
+
+public interface CacheService {
+
+ String get(final String key, int redisType);
+
+ void set(String key, String value, int redisType);
+
+ void set(String key, String value, long timeout, TimeUnit timeUnit, int redisType);
+
+ void del(String key, int redisType);
+
+}
diff --git a/itstack-demo-design-2-01/src/main/java/org/itstack/demo/design/impl/CacheServiceImpl.java b/itstack-demo-design-2-01/src/main/java/org/itstack/demo/design/impl/CacheServiceImpl.java
new file mode 100755
index 0000000..c7889d2
--- /dev/null
+++ b/itstack-demo-design-2-01/src/main/java/org/itstack/demo/design/impl/CacheServiceImpl.java
@@ -0,0 +1,77 @@
+package org.itstack.demo.design.impl;
+
+import org.itstack.demo.design.RedisUtils;
+import org.itstack.demo.design.matter.EGM;
+import org.itstack.demo.design.matter.IIR;
+import org.itstack.demo.design.CacheService;
+
+import java.util.concurrent.TimeUnit;
+
+public class CacheServiceImpl implements CacheService {
+
+ private RedisUtils redisUtils = new RedisUtils();
+
+ private EGM egm = new EGM();
+
+ private IIR iir = new IIR();
+
+ public String get(String key, int redisType) {
+
+ if (1 == redisType) {
+ return egm.gain(key);
+ }
+
+ if (2 == redisType) {
+ return iir.get(key);
+ }
+
+ return redisUtils.get(key);
+ }
+
+ public void set(String key, String value, int redisType) {
+
+ if (1 == redisType) {
+ egm.set(key, value);
+ return;
+ }
+
+ if (2 == redisType) {
+ iir.set(key, value);
+ return;
+ }
+
+ redisUtils.set(key, value);
+ }
+
+ public void set(String key, String value, long timeout, TimeUnit timeUnit, int redisType) {
+
+ if (1 == redisType) {
+ egm.setEx(key, value, timeout, timeUnit);
+ return;
+ }
+
+ if (2 == redisType) {
+ iir.setExpire(key, value, timeout, timeUnit);
+ return;
+ }
+
+ redisUtils.set(key, value, timeout, timeUnit);
+ }
+
+ public void del(String key, int redisType) {
+
+ if (1 == redisType) {
+ egm.delete(key);
+ return;
+ }
+
+ if (2 == redisType) {
+ iir.del(key);
+ return;
+ }
+
+ redisUtils.del(key);
+ }
+
+
+}
diff --git a/itstack-demo-design-2-01/src/test/java/org/itstack/demo/design/test/ApiTest.java b/itstack-demo-design-2-01/src/test/java/org/itstack/demo/design/test/ApiTest.java
new file mode 100755
index 0000000..16d44c1
--- /dev/null
+++ b/itstack-demo-design-2-01/src/test/java/org/itstack/demo/design/test/ApiTest.java
@@ -0,0 +1,20 @@
+package org.itstack.demo.design.test;
+
+import org.itstack.demo.design.CacheService;
+import org.itstack.demo.design.impl.CacheServiceImpl;
+import org.junit.Test;
+
+public class ApiTest {
+
+ @Test
+ public void test_CacheService() {
+
+ CacheService cacheService = new CacheServiceImpl();
+
+ cacheService.set("user_name_01", "小傅哥", 1);
+ String val01 = cacheService.get("user_name_01", 1);
+ System.out.println("测试结果:" + val01);
+
+ }
+
+}
diff --git a/itstack-demo-design-2-02/pom.xml b/itstack-demo-design-2-02/pom.xml
new file mode 100755
index 0000000..66cb5f0
--- /dev/null
+++ b/itstack-demo-design-2-02/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ itstack-demo-design
+ org.itstack
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ itstack-demo-design-2-02
+
+
+
+ org.itstack
+ itstack-demo-design-2-00
+ 1.0-SNAPSHOT
+
+
+
+
\ No newline at end of file
diff --git a/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/CacheService.java b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/CacheService.java
new file mode 100755
index 0000000..8b7f30a
--- /dev/null
+++ b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/CacheService.java
@@ -0,0 +1,15 @@
+package org.itstack.demo.desgin;
+
+import java.util.concurrent.TimeUnit;
+
+public interface CacheService {
+
+ String get(final String key);
+
+ void set(String key, String value);
+
+ void set(String key, String value, long timeout, TimeUnit timeUnit);
+
+ void del(String key);
+
+}
diff --git a/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/ICacheAdapter.java b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/ICacheAdapter.java
new file mode 100755
index 0000000..5d7c392
--- /dev/null
+++ b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/ICacheAdapter.java
@@ -0,0 +1,15 @@
+package org.itstack.demo.desgin.factory;
+
+import java.util.concurrent.TimeUnit;
+
+public interface ICacheAdapter {
+
+ String get(String key);
+
+ void set(String key, String value);
+
+ void set(String key, String value, long timeout, TimeUnit timeUnit);
+
+ void del(String key);
+
+}
diff --git a/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKInvocationHandler.java b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKInvocationHandler.java
new file mode 100755
index 0000000..3641340
--- /dev/null
+++ b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKInvocationHandler.java
@@ -0,0 +1,20 @@
+package org.itstack.demo.desgin.factory;
+
+import org.itstack.demo.desgin.util.ClassLoaderUtils;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+public class JDKInvocationHandler implements InvocationHandler {
+
+ private ICacheAdapter cacheAdapter;
+
+ public JDKInvocationHandler(ICacheAdapter cacheAdapter) {
+ this.cacheAdapter = cacheAdapter;
+ }
+
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return ICacheAdapter.class.getMethod(method.getName(), ClassLoaderUtils.getClazzByArgs(args)).invoke(cacheAdapter, args);
+ }
+
+}
diff --git a/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKProxy.java b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKProxy.java
new file mode 100755
index 0000000..fc85656
--- /dev/null
+++ b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKProxy.java
@@ -0,0 +1,15 @@
+package org.itstack.demo.desgin.factory;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
+public class JDKProxy {
+
+ public static T getProxy(Class interfaceClass, ICacheAdapter cacheAdapter) throws Exception {
+ InvocationHandler handler = new JDKInvocationHandler(cacheAdapter);
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ Class>[] classes = interfaceClass.getInterfaces();
+ return (T) Proxy.newProxyInstance(classLoader, new Class[]{classes[0]}, handler);
+ }
+
+}
diff --git a/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/impl/EGMCacheAdapter.java b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/impl/EGMCacheAdapter.java
new file mode 100755
index 0000000..18be266
--- /dev/null
+++ b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/impl/EGMCacheAdapter.java
@@ -0,0 +1,27 @@
+package org.itstack.demo.desgin.factory.impl;
+
+import org.itstack.demo.desgin.factory.ICacheAdapter;
+import org.itstack.demo.design.matter.EGM;
+
+import java.util.concurrent.TimeUnit;
+
+public class EGMCacheAdapter implements ICacheAdapter {
+
+ private EGM egm = new EGM();
+
+ public String get(String key) {
+ return egm.gain(key);
+ }
+
+ public void set(String key, String value) {
+ egm.set(key, value);
+ }
+
+ public void set(String key, String value, long timeout, TimeUnit timeUnit) {
+ egm.setEx(key, value, timeout, timeUnit);
+ }
+
+ public void del(String key) {
+ egm.delete(key);
+ }
+}
diff --git a/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/impl/IIRCacheAdapter.java b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/impl/IIRCacheAdapter.java
new file mode 100755
index 0000000..5305c20
--- /dev/null
+++ b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/impl/IIRCacheAdapter.java
@@ -0,0 +1,28 @@
+package org.itstack.demo.desgin.factory.impl;
+
+import org.itstack.demo.desgin.factory.ICacheAdapter;
+import org.itstack.demo.design.matter.IIR;
+
+import java.util.concurrent.TimeUnit;
+
+public class IIRCacheAdapter implements ICacheAdapter {
+
+ private IIR iir = new IIR();
+
+ public String get(String key) {
+ return iir.get(key);
+ }
+
+ public void set(String key, String value) {
+ iir.set(key, value);
+ }
+
+ public void set(String key, String value, long timeout, TimeUnit timeUnit) {
+ iir.setExpire(key, value, timeout, timeUnit);
+ }
+
+ public void del(String key) {
+ iir.del(key);
+ }
+
+}
diff --git a/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/impl/CacheServiceImpl.java b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/impl/CacheServiceImpl.java
new file mode 100755
index 0000000..5aa8d04
--- /dev/null
+++ b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/impl/CacheServiceImpl.java
@@ -0,0 +1,28 @@
+package org.itstack.demo.desgin.impl;
+
+import org.itstack.demo.desgin.CacheService;
+import org.itstack.demo.design.RedisUtils;
+
+import java.util.concurrent.TimeUnit;
+
+public class CacheServiceImpl implements CacheService {
+
+ private RedisUtils redisUtils = new RedisUtils();
+
+ public String get(String key) {
+ return redisUtils.get(key);
+ }
+
+ public void set(String key, String value) {
+ redisUtils.set(key, value);
+ }
+
+ public void set(String key, String value, long timeout, TimeUnit timeUnit) {
+ redisUtils.set(key, value, timeout, timeUnit);
+ }
+
+ public void del(String key) {
+ redisUtils.del(key);
+ }
+
+}
diff --git a/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/util/ClassLoaderUtils.java b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/util/ClassLoaderUtils.java
new file mode 100755
index 0000000..d77764a
--- /dev/null
+++ b/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/util/ClassLoaderUtils.java
@@ -0,0 +1,186 @@
+package org.itstack.demo.desgin.util;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+public class ClassLoaderUtils {
+
+ private static Set primitiveSet = new HashSet();
+
+ static {
+ primitiveSet.add(Integer.class);
+ primitiveSet.add(Long.class);
+ primitiveSet.add(Float.class);
+ primitiveSet.add(Byte.class);
+ primitiveSet.add(Short.class);
+ primitiveSet.add(Double.class);
+ primitiveSet.add(Character.class);
+ primitiveSet.add(Boolean.class);
+ }
+
+ /**
+ * 得到当前ClassLoader
+ *
+ * @return ClassLoader
+ */
+ public static ClassLoader getCurrentClassLoader() {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ if (cl == null) {
+ cl = ClassLoaderUtils.class.getClassLoader();
+ }
+ return cl == null ? ClassLoader.getSystemClassLoader() : cl;
+ }
+
+ /**
+ * 得到当前ClassLoader
+ *
+ * @param clazz 某个类
+ * @return ClassLoader
+ */
+ public static ClassLoader getClassLoader(Class> clazz) {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if (loader != null) {
+ return loader;
+ }
+ if (clazz != null) {
+ loader = clazz.getClassLoader();
+ if (loader != null) {
+ return loader;
+ }
+ return clazz.getClassLoader();
+ }
+ return ClassLoader.getSystemClassLoader();
+ }
+
+ /**
+ * 根据类名加载Class
+ *
+ * @param className 类名
+ * @return Class
+ * @throws ClassNotFoundException 找不到类
+ */
+ public static Class forName(String className)
+ throws ClassNotFoundException {
+ return forName(className, true);
+ }
+
+ /**
+ * 根据类名加载Class
+ *
+ * @param className 类名
+ * @param initialize 是否初始化
+ * @return Class
+ * @throws ClassNotFoundException 找不到类
+ */
+ public static Class forName(String className, boolean initialize)
+ throws ClassNotFoundException {
+ return Class.forName(className, initialize, getCurrentClassLoader());
+ }
+
+ /**
+ * 根据类名加载Class
+ *
+ * @param className 类名
+ * @param cl Classloader
+ * @return Class
+ * @throws ClassNotFoundException 找不到类
+ */
+ public static Class forName(String className, ClassLoader cl)
+ throws ClassNotFoundException {
+ return Class.forName(className, true, cl);
+ }
+
+ /**
+ * 实例化一个对象(只检测默认构造函数,其它不管)
+ *
+ * @param clazz 对象类
+ * @param 对象具体类
+ * @return 对象实例
+ * @throws Exception 没有找到方法,或者无法处理,或者初始化方法异常等
+ */
+ public static T newInstance(Class clazz) throws Exception {
+ if (primitiveSet.contains(clazz)) {
+ return null;
+ }
+ if (clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers())) {
+ Constructor constructorList[] = clazz.getDeclaredConstructors();
+ Constructor defaultConstructor = null;
+ for (Constructor con : constructorList) {
+ if (con.getParameterTypes().length == 1) {
+ defaultConstructor = con;
+ break;
+ }
+ }
+ if (defaultConstructor != null) {
+ if (defaultConstructor.isAccessible()) {
+ return (T) defaultConstructor.newInstance(new Object[]{null});
+ } else {
+ try {
+ defaultConstructor.setAccessible(true);
+ return (T) defaultConstructor.newInstance(new Object[]{null});
+ } finally {
+ defaultConstructor.setAccessible(false);
+ }
+ }
+ } else {
+ throw new Exception("The " + clazz.getCanonicalName() + " has no default constructor!");
+ }
+ }
+ try {
+ return clazz.newInstance();
+ } catch (Exception e) {
+ Constructor constructor = clazz.getDeclaredConstructor();
+ if (constructor.isAccessible()) {
+ throw new Exception("The " + clazz.getCanonicalName() + " has no default constructor!", e);
+ } else {
+ try {
+ constructor.setAccessible(true);
+ return constructor.newInstance();
+ } finally {
+ constructor.setAccessible(false);
+ }
+ }
+ }
+ }
+
+ public static Class>[] getClazzByArgs(Object[] args) {
+ Class>[] parameterTypes = new Class[args.length];
+ for (int i = 0; i < args.length; i++) {
+ if (args[i] instanceof ArrayList) {
+ parameterTypes[i] = List.class;
+ continue;
+ }
+ if (args[i] instanceof LinkedList) {
+ parameterTypes[i] = List.class;
+ continue;
+ }
+ if (args[i] instanceof HashMap) {
+ parameterTypes[i] = Map.class;
+ continue;
+ }
+ if (args[i] instanceof Long){
+ parameterTypes[i] = long.class;
+ continue;
+ }
+ if (args[i] instanceof Double){
+ parameterTypes[i] = double.class;
+ continue;
+ }
+ if (args[i] instanceof TimeUnit){
+ parameterTypes[i] = TimeUnit.class;
+ continue;
+ }
+ parameterTypes[i] = args[i].getClass();
+ }
+ return parameterTypes;
+ }
+
+ public Method getMethod(Class> classType, String methodName, Class>... parameterTypes) throws NoSuchMethodException {
+ return classType.getMethod(methodName, parameterTypes);
+ }
+
+}
+
diff --git a/itstack-demo-design-2-02/src/test/java/org/itstack/demo/desgin/test/ApiTest.java b/itstack-demo-design-2-02/src/test/java/org/itstack/demo/desgin/test/ApiTest.java
new file mode 100755
index 0000000..2656b93
--- /dev/null
+++ b/itstack-demo-design-2-02/src/test/java/org/itstack/demo/desgin/test/ApiTest.java
@@ -0,0 +1,27 @@
+package org.itstack.demo.desgin.test;
+
+import org.itstack.demo.desgin.CacheService;
+import org.itstack.demo.desgin.factory.JDKProxy;
+import org.itstack.demo.desgin.factory.impl.EGMCacheAdapter;
+import org.itstack.demo.desgin.factory.impl.IIRCacheAdapter;
+import org.itstack.demo.desgin.impl.CacheServiceImpl;
+import org.junit.Test;
+
+public class ApiTest {
+
+ @Test
+ public void test_CacheService() throws Exception {
+
+ CacheService proxy_EGM = JDKProxy.getProxy(CacheServiceImpl.class, new EGMCacheAdapter());
+ proxy_EGM.set("user_name_01", "小傅哥");
+ String val01 = proxy_EGM.get("user_name_01");
+ System.out.println("测试结果:" + val01);
+
+ CacheService proxy_IIR = JDKProxy.getProxy(CacheServiceImpl.class, new IIRCacheAdapter());
+ proxy_IIR.set("user_name_01", "小傅哥");
+ String val02 = proxy_IIR.get("user_name_01");
+ System.out.println("测试结果:" + val02);
+
+ }
+
+}
diff --git a/pom.xml b/pom.xml
new file mode 100755
index 0000000..8dda9d0
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,57 @@
+
+
+ 4.0.0
+
+ org.itstack
+ itstack-demo-design
+ pom
+ 1.0-SNAPSHOT
+
+ itstack-demo-design-1-01
+ itstack-demo-design-1-00
+ itstack-demo-design-1-02
+ itstack-demo-design-2-00
+ itstack-demo-design-2-01
+ itstack-demo-design-2-02
+
+
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.68
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.5
+
+
+ org.slf4j
+ jcl-over-slf4j
+ 1.7.5
+
+
+ ch.qos.logback
+ logback-classic
+ 1.0.9
+
+
+ slf4j-api
+ org.slf4j
+
+
+
+
+
+
\ No newline at end of file
--
GitLab