diff --git a/pom.xml b/pom.xml
index 1ca5c42..8330604 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,5 +19,11 @@
spring-context
5.3.21
+
+
+ cglib
+ cglib
+ 3.3.0
+
\ No newline at end of file
diff --git a/src/main/java/proxy/Movable.java b/src/main/java/proxy/Movable.java
new file mode 100644
index 0000000..e0f60d1
--- /dev/null
+++ b/src/main/java/proxy/Movable.java
@@ -0,0 +1,5 @@
+package proxy;
+
+public interface Movable {
+ void move();
+}
diff --git a/src/main/java/proxy/Tank.java b/src/main/java/proxy/Tank.java
new file mode 100644
index 0000000..8e66f76
--- /dev/null
+++ b/src/main/java/proxy/Tank.java
@@ -0,0 +1,16 @@
+package proxy;
+
+import java.util.Random;
+
+public class Tank implements Movable{
+
+ @Override
+ public void move(){
+ System.out.println("tank is moving...");
+ try {
+ Thread.sleep(new Random().nextInt(10000));
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/proxy/cglib/Main.java b/src/main/java/proxy/cglib/Main.java
new file mode 100644
index 0000000..e8e28cb
--- /dev/null
+++ b/src/main/java/proxy/cglib/Main.java
@@ -0,0 +1,26 @@
+package proxy.cglib;
+
+import net.sf.cglib.proxy.Enhancer;
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+import proxy.Tank;
+
+import java.lang.reflect.Method;
+
+public class Main {
+ public static void main(String[] args) {
+ Enhancer enhancer = new Enhancer();
+ enhancer.setSuperclass(Tank.class);
+ enhancer.setCallback(new MethodInterceptor() {
+ @Override
+ public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
+ System.out.println("before...");
+ Object result = methodProxy.invokeSuper(o, objects);
+ System.out.println("end...");
+ return result;
+ }
+ });
+ Tank tank = (Tank) enhancer.create();
+ tank.move();
+ }
+}
diff --git a/src/main/java/proxy/dynamic/MainV1.java b/src/main/java/proxy/dynamic/MainV1.java
new file mode 100644
index 0000000..cf5c868
--- /dev/null
+++ b/src/main/java/proxy/dynamic/MainV1.java
@@ -0,0 +1,43 @@
+package proxy.dynamic;
+
+import proxy.Movable;
+import proxy.Tank;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+public class MainV1 {
+ public static void main(String[] args) {
+ Tank tank = new Tank();
+ Movable m = (Movable) Proxy.newProxyInstance(tank.getClass().getClassLoader(), new Class[]{Movable.class}, new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ System.out.println("method " + method.getName() + " start...");
+ Object o = method.invoke(tank, args);
+ System.out.println("method " + method.getName() + " end...");
+ return o;
+ }
+ });
+ m.move();
+ System.out.println("-------------------------------------------------------------------------------------------------------");
+ Movable m2 = (Movable) Proxy.newProxyInstance(tank.getClass().getClassLoader(), new Class[]{Movable.class}, new TankLogHandler(tank));
+ m2.move();
+ }
+}
+
+class TankLogHandler implements InvocationHandler{
+ private Tank tank;
+
+ public TankLogHandler(Tank tank) {
+ this.tank = tank;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ System.out.println("tank start...");
+ Object o = method.invoke(tank, args);
+ System.out.println("tank stop...");
+ return o;
+ }
+}
diff --git a/src/main/java/proxy/st/Main.java b/src/main/java/proxy/st/Main.java
new file mode 100644
index 0000000..1da8300
--- /dev/null
+++ b/src/main/java/proxy/st/Main.java
@@ -0,0 +1,11 @@
+package proxy.st;
+
+import proxy.Tank;
+
+public class Main {
+ public static void main(String[] args) {
+ new TankTimeProxy(new TankLogProxy(new Tank())).move();
+ // log start -> tank moving -> log end -> tank move time
+ new TankLogProxy(new TankTimeProxy(new Tank())).move();
+ }
+}
diff --git a/src/main/java/proxy/st/TankLogProxy.java b/src/main/java/proxy/st/TankLogProxy.java
new file mode 100644
index 0000000..c9978dd
--- /dev/null
+++ b/src/main/java/proxy/st/TankLogProxy.java
@@ -0,0 +1,18 @@
+package proxy.st;
+
+import proxy.Movable;
+
+public class TankLogProxy implements Movable {
+ private Movable m;
+
+ public TankLogProxy(Movable m) {
+ this.m = m;
+ }
+
+ @Override
+ public void move() {
+ System.out.println("tank start moving...");
+ m.move();
+ System.out.println("tank end moving...");
+ }
+}
diff --git a/src/main/java/proxy/st/TankTimeProxy.java b/src/main/java/proxy/st/TankTimeProxy.java
new file mode 100644
index 0000000..2b88c66
--- /dev/null
+++ b/src/main/java/proxy/st/TankTimeProxy.java
@@ -0,0 +1,22 @@
+package proxy.st;
+
+import proxy.Movable;
+
+/*
+* 坦克move时间代理 move前后进行一些处理
+* */
+public class TankTimeProxy implements Movable {
+ private Movable m;
+
+ public TankTimeProxy(Movable m) {
+ this.m = m;
+ }
+
+ @Override
+ public void move() {
+ long start = System.currentTimeMillis();
+ m.move();
+ long end = System.currentTimeMillis();
+ System.out.println("move time: " + (end-start));
+ }
+}