[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/UserXSX/JavaGuide/main/docs/java/basis/proxy.md [Back]  [Original]

--- title: Java description: JavaJDKCGLIBAOP category: Java tag: - Java head: - - meta - name: keywords content: Java,,,JDK,CGLIB,AOP,, --- ## 1. **(real object)** **** ![Understanding the Proxy Design Pattern | by Mithun Sasidharan | Medium](https://oss.javaguide.cn/2020-8/1*DjWCgTFm-xqbhbNQVsaWQw.png)

https://medium.com/@mithunsasidharan/understanding-the-proxy-design-pattern-5e63fe38052a

## 2. ( JVM ** class ** : 1. 2. 3. **1.** ```java public interface SmsService { String send(String message); } ``` **2.** ```java public class SmsServiceImpl implements SmsService { public String send(String message) { System.out.println("send message:" + message); return message; } } ``` **3.** ```java public class SmsProxy implements SmsService { private final SmsService smsService; public SmsProxy(SmsService smsService) { this.smsService = smsService; } @Override public String send(String message) { // System.out.println("before method send()"); smsService.send(message); // System.out.println("after method send()"); return null; } } ``` **4.** ```java public class Main { public static void main(String[] args) { SmsService smsService = new SmsServiceImpl(); SmsProxy smsProxy = new SmsProxy(smsService); smsProxy.send("java"); } } ``` ```bash before method send() send message:java after method send() ``` `SmsServiceImpl` `send()` ## 3. ( CGLIB ) ** JVM JVM ** Spring AOPRPC **** Java **JDK ****CGLIB ** [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) JDK JDK [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) **CGLIB ** **JDK ** ### 3.1. JDK #### 3.1.1. ** Java `InvocationHandler` `Proxy` ** `Proxy` `newProxyInstance()` ```java public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) throws IllegalArgumentException { ...... } ``` 3 1. **loader** : 2. **interfaces** : 3. **h** : `InvocationHandler` `InvocationHandler` `InvocationHandler` `invoke` ```java public interface InvocationHandler { /** * */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; } ``` `invoke()` 1. **proxy** : 2. **method** : 3. **args** : method **`Proxy` `newProxyInstance()` `InvocationHandler` `invoke()`** `invoke()` #### 3.1.2. JDK 1. 2. `InvocationHandler` `invoke` `invoke` 3. `Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)` #### 3.1.3. **1.** ```java public interface SmsService { String send(String message); } ``` **2.** ```java public class SmsServiceImpl implements SmsService { public String send(String message) { System.out.println("send message:" + message); return message; } } ``` **3. JDK ** ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author shuang.kou * @createTime 20200511 11:23:00 */ 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("before method " + method.getName()); Object result = method.invoke(target, args); // System.out.println("after method " + method.getName()); return result; } } ``` `invoke()` : `invoke()` `invoke()` **4.** ```java public class JdkProxyFactory { public static Object getProxy(Object target) { return Proxy.newProxyInstance( target.getClass().getClassLoader(), // target.getClass().getInterfaces(), // new DebugInvocationHandler(target) // InvocationHandler ); } } ``` `getProxy()``Proxy.newProxyInstance` **5.** ```java SmsService smsService = (SmsService) JdkProxyFactory.getProxy(new SmsServiceImpl()); smsService.send("java"); ``` ```plain before method send send message:java after method send ``` ### 3.2. CGLIB #### 3.2.1. **JDK ** ** CGLIB ** [CGLIB](https://github.com/cglib/cglib)(_Code Generation Library_)[ASM](http://www.baeldung.com/java-asm)CGLIB [CGLIB](https://github.com/cglib/cglib) Spring AOP JDK CGLIB ** CGLIB `MethodInterceptor` `Enhancer` ** `MethodInterceptor` `intercept` `intercept` ```java public interface MethodInterceptor extends Callback{ // public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,MethodProxy proxy) throws Throwable; } ``` 1. **obj** : 2. **method** : 3. **args** : 4. **proxy** : `Enhancer` `MethodInterceptor` `intercept` #### 3.2.2. CGLIB 1. 2. `MethodInterceptor` `intercept` `intercept` JDK `invoke` 3. `Enhancer` `create()` #### 3.2.3. JDK [CGLIB](https://github.com/cglib/cglib)(_Code Generation Library_) ```xml cglib cglib 3.3.0 ``` **1.** ```java package github.javaguide.dynamicProxy.cglibDynamicProxy; public class AliSmsService { public String send(String message) { System.out.println("send message:" + message); return message; } } ``` **2. `MethodInterceptor`** ```java import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * MethodInterceptor */ public class DebugMethodInterceptor implements MethodInterceptor { /** * @param o method.invoke(o, args) * @param method * @param args * @param methodProxy */ @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { // System.out.println("before method " + method.getName()); Object object = methodProxy.invokeSuper(o, args); // System.out.println("after method " + method.getName()); return object; } } ``` **3.** ```java 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(); } } ``` **4.** ```java AliSmsService aliSmsService = (AliSmsService) CglibProxyFactory.getProxy(AliSmsService.class); aliSmsService.send("java"); ``` ```bash before method send send message:java after method send ``` ### 3.3. JDK CGLIB 1. JDK CGLIB `final` `final` `private` 2. JDK JDK ## 4. **** | | (Static Proxy) | (Dynamic Proxy) | | ---------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | | | `.class` | JVM | | | | `Handler`/`Interceptor` | | | | | | | | | | | | | | | | Spring AOPRPC DubboORM | ## 5. JDK Cglib [https://github.com/Snailclimb/guide-rpc-framework-learning/tree/master/src/main/java/github/javaguide/proxy](https://github.com/Snailclimb/guide-rpc-framework-learning/tree/master/src/main/java/github/javaguide/proxy)
Web Proxy Viewer  |  New URL  |  Original Page