---
title: Java
description: JavaJDKCGLIBAOP
category: Java
tag:
- Java
head:
- - meta
- name: keywords
content: Java,,,JDK,CGLIB,AOP,,
---
## 1.
**(real object)**
****

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)