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
+