From febdcd66feb483b3e56cc98a613d3b42bfbdc802 Mon Sep 17 00:00:00 2001 From: terry <724796052@qq.com> Date: Sat, 2 Jul 2022 18:45:27 +0800 Subject: [PATCH] proxy pattern --- pom.xml | 6 ++++ src/main/java/proxy/Movable.java | 5 +++ src/main/java/proxy/Tank.java | 16 +++++++++ src/main/java/proxy/cglib/Main.java | 26 ++++++++++++++ src/main/java/proxy/dynamic/MainV1.java | 43 +++++++++++++++++++++++ src/main/java/proxy/st/Main.java | 11 ++++++ src/main/java/proxy/st/TankLogProxy.java | 18 ++++++++++ src/main/java/proxy/st/TankTimeProxy.java | 22 ++++++++++++ 8 files changed, 147 insertions(+) create mode 100644 src/main/java/proxy/Movable.java create mode 100644 src/main/java/proxy/Tank.java create mode 100644 src/main/java/proxy/cglib/Main.java create mode 100644 src/main/java/proxy/dynamic/MainV1.java create mode 100644 src/main/java/proxy/st/Main.java create mode 100644 src/main/java/proxy/st/TankLogProxy.java create mode 100644 src/main/java/proxy/st/TankTimeProxy.java 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)); + } +}