From 10ef2380e14cd98cdbc04d223363e45c2bc02abe Mon Sep 17 00:00:00 2001 From: wyl <959814898@qq.com> Date: Tue, 28 Dec 2021 00:01:23 +0800 Subject: [PATCH] first commit --- .gitignore | 1 + dynamic-proxy/pom.xml | 27 ++++++++++++++++++ .../demo/proxy/cglib/CglibProxyFactory.java | 19 +++++++++++++ .../proxy/cglib/DebugMethodInterceptor.java | 23 +++++++++++++++ .../java/com/wyl/demo/proxy/cglib/Main.java | 17 +++++++++++ .../wyl/demo/proxy/cglib/MessageService.java | 8 ++++++ .../proxy/java/DebugInvocationHandler.java | 27 ++++++++++++++++++ .../java/com/wyl/demo/proxy/java/Main.java | 15 ++++++++++ .../wyl/demo/proxy/java/MessageService.java | 5 ++++ .../demo/proxy/java/MessageServiceImpl.java | 8 ++++++ pom.xml | 28 +++++++++++++++++++ 11 files changed, 178 insertions(+) create mode 100644 dynamic-proxy/pom.xml create mode 100644 dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/CglibProxyFactory.java create mode 100644 dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/DebugMethodInterceptor.java create mode 100644 dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/Main.java create mode 100644 dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/MessageService.java create mode 100644 dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/DebugInvocationHandler.java create mode 100644 dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/Main.java create mode 100644 dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/MessageService.java create mode 100644 dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/MessageServiceImpl.java create mode 100644 pom.xml diff --git a/.gitignore b/.gitignore index 0ba064c..5caf1b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/.idea/ # ---> Java # Compiled class file *.class diff --git a/dynamic-proxy/pom.xml b/dynamic-proxy/pom.xml new file mode 100644 index 0000000..068e506 --- /dev/null +++ b/dynamic-proxy/pom.xml @@ -0,0 +1,27 @@ + + + + JavaBasiceDemo + com.wyl.example + 1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + + dynamic-proxy + + + 8 + 8 + + + + cglib + cglib + + + + \ No newline at end of file diff --git a/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/CglibProxyFactory.java b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/CglibProxyFactory.java new file mode 100644 index 0000000..8322de4 --- /dev/null +++ b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/CglibProxyFactory.java @@ -0,0 +1,19 @@ +package com.wyl.demo.proxy.cglib; + +import net.sf.cglib.proxy.Enhancer; + +public class CglibProxyFactory { + + public static Object getProxy(Class clazz) { + // 创建动态代理增强类 + Enhancer enhancer = new Enhancer(); + // 设置类加载器 + enhancer.setClassLoader(clazz.getClassLoader()); + // 设置被代理类 + enhancer.setSuperclass(clazz); + // 设置方法拦截器 + enhancer.setCallback(new DebugMethodInterceptor()); + // 创建代理类 + return enhancer.create(); + } +} diff --git a/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/DebugMethodInterceptor.java b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/DebugMethodInterceptor.java new file mode 100644 index 0000000..9f4ed0e --- /dev/null +++ b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/DebugMethodInterceptor.java @@ -0,0 +1,23 @@ +package com.wyl.demo.proxy.cglib; + +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + +import java.lang.reflect.Method; + +/** + * 自定义MethodInterceptor + */ +public class DebugMethodInterceptor implements MethodInterceptor { + @Override + public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + //调用方法之前,我们可以添加自己的操作 + System.out.println("cglib before method " + method.getName()); + // 调用被代理类的原有方法 + Object object = methodProxy.invokeSuper(o, args); + //调用方法之后,我们同样可以添加自己的操作 + System.out.println("cglib after method " + method.getName()); + return object; + } + +} diff --git a/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/Main.java b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/Main.java new file mode 100644 index 0000000..dbcf6ca --- /dev/null +++ b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/Main.java @@ -0,0 +1,17 @@ +package com.wyl.demo.proxy.cglib; + +import net.sf.cglib.proxy.Enhancer; + +public class Main { + public static void main(String[] args) { + Enhancer enhancer = new Enhancer(); + // 设置类加载器 + enhancer.setClassLoader(MessageService.class.getClassLoader()); + // 设置被代理类 + enhancer.setSuperclass(MessageService.class); + // 设置方法拦截器 + enhancer.setCallback(new DebugMethodInterceptor()); + MessageService messageService = (MessageService) enhancer.create(); + messageService.send("wyl"); + } +} diff --git a/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/MessageService.java b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/MessageService.java new file mode 100644 index 0000000..da5aa1d --- /dev/null +++ b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/cglib/MessageService.java @@ -0,0 +1,8 @@ +package com.wyl.demo.proxy.cglib; + +public class MessageService { + public String send(String message) { + System.out.println("send message:" + message); + return message; + } +} diff --git a/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/DebugInvocationHandler.java b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/DebugInvocationHandler.java new file mode 100644 index 0000000..9f11ced --- /dev/null +++ b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/DebugInvocationHandler.java @@ -0,0 +1,27 @@ +package com.wyl.demo.proxy.java; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class DebugInvocationHandler implements InvocationHandler { + /** + * 代理类中的真实对象 + */ + private final Object target; + + public DebugInvocationHandler(Object target) { + this.target = target; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException { + //调用方法之前,我们可以添加自己的操作 + System.out.println("java before method " + method.getName()); + // 调用被代理类的原有方法 + Object result = method.invoke(target, args); + //调用方法之后,我们同样可以添加自己的操作 + System.out.println("java after method " + method.getName()); + return result; + } +} diff --git a/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/Main.java b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/Main.java new file mode 100644 index 0000000..d1dacf7 --- /dev/null +++ b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/Main.java @@ -0,0 +1,15 @@ +package com.wyl.demo.proxy.java; + +import java.lang.reflect.Proxy; + +public class Main { + public static void main(String[] args) { + MessageServiceImpl messageServiceImpl = new MessageServiceImpl(); + MessageService messageServiceProxy = (MessageService) Proxy.newProxyInstance(messageServiceImpl.getClass() + .getClassLoader(), // 目标类的类加载 + messageServiceImpl.getClass() + .getInterfaces(), // 代理需要实现的接口,可指定多个 + new DebugInvocationHandler(messageServiceImpl)); + messageServiceProxy.send("java"); + } +} diff --git a/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/MessageService.java b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/MessageService.java new file mode 100644 index 0000000..85c7649 --- /dev/null +++ b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/MessageService.java @@ -0,0 +1,5 @@ +package com.wyl.demo.proxy.java; + +public interface MessageService { + String send(String message); +} diff --git a/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/MessageServiceImpl.java b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/MessageServiceImpl.java new file mode 100644 index 0000000..a824142 --- /dev/null +++ b/dynamic-proxy/src/main/java/com/wyl/demo/proxy/java/MessageServiceImpl.java @@ -0,0 +1,8 @@ +package com.wyl.demo.proxy.java; + +public class MessageServiceImpl implements MessageService { + public String send(String message) { + System.out.println("send message:" + message); + return message; + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..95484eb --- /dev/null +++ b/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + com.wyl.example + JavaBasiceDemo + 1.0-SNAPSHOT + + dynamic-proxy + + pom + + 8 + 8 + + + + + cglib + cglib + 3.3.0 + + + + + \ No newline at end of file