From 69a9807e817baa88b24ebd952b3e7a99dbffe75e Mon Sep 17 00:00:00 2001 From: YunaiV <> Date: Wed, 9 Sep 2020 22:08:09 +0800 Subject: [PATCH] =?UTF-8?q?java=20=E5=90=84=E7=A7=8D=20proxy=20=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++--- lab-69-proxy/lab-69-proxy-cglib/pom.xml | 22 ++++++++++++++++ .../springboot/labs/lab69/TestProxyMain.java | 19 ++++++++++++++ .../UserServiceMethodInterceptor.java | 17 ++++++++++++ .../labs/lab69/service/UserServiceImpl.java | 9 +++++++ lab-69-proxy/lab-69-proxy-jdk/pom.xml | 22 ++++++++++++++++ .../labs/lab69/GenerateProxyMain.java | 25 ++++++++++++++++++ .../springboot/labs/lab69/TestProxyMain.java | 26 +++++++++++++++++++ .../lab69/handler/UserServiceHandler.java | 24 +++++++++++++++++ .../labs/lab69/service/UserService.java | 7 +++++ .../labs/lab69/service/UserServiceImpl.java | 9 +++++++ lab-69-proxy/pom.xml | 20 ++++++++++++++ pom.xml | 2 ++ 13 files changed, 206 insertions(+), 4 deletions(-) create mode 100644 lab-69-proxy/lab-69-proxy-cglib/pom.xml create mode 100644 lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/TestProxyMain.java create mode 100644 lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/intercept/UserServiceMethodInterceptor.java create mode 100644 lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserServiceImpl.java create mode 100644 lab-69-proxy/lab-69-proxy-jdk/pom.xml create mode 100644 lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/GenerateProxyMain.java create mode 100644 lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/TestProxyMain.java create mode 100644 lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/handler/UserServiceHandler.java create mode 100644 lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserService.java create mode 100644 lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserServiceImpl.java create mode 100644 lab-69-proxy/pom.xml diff --git a/README.md b/README.md index 0181341f..9ee72fd2 100644 --- a/README.md +++ b/README.md @@ -397,10 +397,10 @@ 如下是草稿目录,未来需要整理下 -# lab-9 - -记录阅读极客时间《数据结构与算法之美》的题目。 - # lab-50 Email 示例 + +# lab-69-proxy + +动态代理 diff --git a/lab-69-proxy/lab-69-proxy-cglib/pom.xml b/lab-69-proxy/lab-69-proxy-cglib/pom.xml new file mode 100644 index 00000000..c9d1e933 --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-cglib/pom.xml @@ -0,0 +1,22 @@ + + + + lab-69 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-69-proxy-cglib + + + + cglib + cglib + 3.3.0 + + + + diff --git a/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/TestProxyMain.java b/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/TestProxyMain.java new file mode 100644 index 00000000..9885e9df --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/TestProxyMain.java @@ -0,0 +1,19 @@ +package cn.iocoder.springboot.labs.lab69; + +import cn.iocoder.springboot.labs.lab69.intercept.UserServiceMethodInterceptor; +import cn.iocoder.springboot.labs.lab69.service.UserServiceImpl; +import net.sf.cglib.proxy.Enhancer; + +public class TestProxyMain { + + public static void main(String[] args) { + // 创建 cglib 增强对象 + Enhancer enhancer = new Enhancer(); + enhancer.setSuperclass(UserServiceImpl.class); // 设置父类 + enhancer.setCallback(new UserServiceMethodInterceptor()); + // 创建代理 + UserServiceImpl userService = (UserServiceImpl) enhancer.create(); + userService.create("yunai", "buzhidao"); + } + +} diff --git a/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/intercept/UserServiceMethodInterceptor.java b/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/intercept/UserServiceMethodInterceptor.java new file mode 100644 index 00000000..c607ee00 --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/intercept/UserServiceMethodInterceptor.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.labs.lab69.intercept; + +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + +import java.lang.reflect.Method; + +public class UserServiceMethodInterceptor implements MethodInterceptor { + + public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + System.out.println("before invoke"); + Object ret = methodProxy.invokeSuper(object, args); + System.out.println("after invoke"); + return ret; + } + +} diff --git a/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserServiceImpl.java b/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserServiceImpl.java new file mode 100644 index 00000000..61a1f79f --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-cglib/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserServiceImpl.java @@ -0,0 +1,9 @@ +package cn.iocoder.springboot.labs.lab69.service; + +public class UserServiceImpl { + + public void create(String username, String password) { + System.out.println(String.format("登陆的用户名(%s) 密码(%s)", username, password)); + } + +} diff --git a/lab-69-proxy/lab-69-proxy-jdk/pom.xml b/lab-69-proxy/lab-69-proxy-jdk/pom.xml new file mode 100644 index 00000000..239401ba --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-jdk/pom.xml @@ -0,0 +1,22 @@ + + + + lab-69 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-69-proxy-jdk + + + + commons-io + commons-io + 2.7 + + + + diff --git a/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/GenerateProxyMain.java b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/GenerateProxyMain.java new file mode 100644 index 00000000..1c57a196 --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/GenerateProxyMain.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.labs.lab69; + +import cn.iocoder.springboot.labs.lab69.service.UserServiceImpl; +import org.apache.commons.io.IOUtils; +import sun.misc.ProxyGenerator; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Proxy; + +/** + * 生成 JDK {@link Proxy} 的示例代码 + * + * 生成后,我们可以反编译查看具体的类 + */ +public class GenerateProxyMain { + + public static void main(String[] args) throws IOException { + // 生成字节码 + byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy11", UserServiceImpl.class.getInterfaces()); + // 写入到磁盘 + IOUtils.write(classFile, new FileOutputStream("/Users/yunai/ls/$Proxy11.class")); + } + +} diff --git a/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/TestProxyMain.java b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/TestProxyMain.java new file mode 100644 index 00000000..b67f6379 --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/TestProxyMain.java @@ -0,0 +1,26 @@ +package cn.iocoder.springboot.labs.lab69; + +import cn.iocoder.springboot.labs.lab69.handler.UserServiceHandler; +import cn.iocoder.springboot.labs.lab69.service.UserService; +import cn.iocoder.springboot.labs.lab69.service.UserServiceImpl; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; + +/** + * 使用 JDK {@link Proxy} 实现一个动态代理的示例 + */ +public class TestProxyMain { + + public static void main(String[] args) { + // 创建 UserService 对象 + UserService userService = new UserServiceImpl(); + // JDK 处理器 + InvocationHandler handler = new UserServiceHandler(userService); + // 创建代理 + UserService userServiceProxy = (UserService) Proxy.newProxyInstance(TestProxyMain.class.getClassLoader(), userService.getClass().getInterfaces(), handler); + // 执行 + userServiceProxy.create("yunai", "buzhidao"); + } + +} diff --git a/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/handler/UserServiceHandler.java b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/handler/UserServiceHandler.java new file mode 100644 index 00000000..06d62cb1 --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/handler/UserServiceHandler.java @@ -0,0 +1,24 @@ +package cn.iocoder.springboot.labs.lab69.handler; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class UserServiceHandler implements InvocationHandler { + + /** + * 被代理的对象 + */ + private final Object object; + + public UserServiceHandler(Object object) { + this.object = object; + } + + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + System.out.println("before invoke"); + Object ret = method.invoke(object, args); + System.out.println("after invoke"); + return ret; + } + +} diff --git a/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserService.java b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserService.java new file mode 100644 index 00000000..234b5dc4 --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserService.java @@ -0,0 +1,7 @@ +package cn.iocoder.springboot.labs.lab69.service; + +public interface UserService { + + void create(String username, String password); + +} diff --git a/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserServiceImpl.java b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserServiceImpl.java new file mode 100644 index 00000000..7bab724d --- /dev/null +++ b/lab-69-proxy/lab-69-proxy-jdk/src/main/java/cn/iocoder/springboot/labs/lab69/service/UserServiceImpl.java @@ -0,0 +1,9 @@ +package cn.iocoder.springboot.labs.lab69.service; + +public class UserServiceImpl implements UserService { + + public void create(String username, String password) { + System.out.println(String.format("登陆的用户名(%s) 密码(%s)", username, password)); + } + +} diff --git a/lab-69-proxy/pom.xml b/lab-69-proxy/pom.xml new file mode 100644 index 00000000..45f9b82d --- /dev/null +++ b/lab-69-proxy/pom.xml @@ -0,0 +1,20 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-69 + pom + + lab-69-proxy-jdk + lab-69-proxy-cglib + + + + diff --git a/pom.xml b/pom.xml index 1127eda6..e9c2abdd 100644 --- a/pom.xml +++ b/pom.xml @@ -76,6 +76,8 @@ + lab-69-proxy +