# Java 代ç
说å¨åé¢ï¼ä»å¤©æä»¬æ¥èä¸è Java ä¸ç代çï¼å
æ¥èèæ
äºèæ¯ï¼
> å°ææ³è´ä¹°æ³å½æä¸ªçåç馿°´éç»å¥³æåï¼ä½æ¯å¨å½å
没æè´§æºå®åï¼äº²èªå»æ³å½å大费å¨ç« äºï¼èå°çº¢ç°å¨æ£å¨æ³å½ç©èï¼å¥¹åå°ææ¯å¥½æåï¼å¯ä»¥å¸®å°æä¹°å°è¿ä¸ªçåç馿°´ï¼äºæ¯å°æå°±æ¾å°å°çº¢ï¼çåºç»å¥¹å¤å 5% çè¾è¦è´¹ï¼å°çº¢çåºäºï¼å°ææåå¨ä¸å½ä¹°å°äºæ³å½ç馿°´ãä¹åå°çº¢å¼å¯äºç¯ççä»£è´æ¨¡å¼ï¼èµå°äºå¾å¤æç»è´¹ã
卿
äºä¸ï¼**å°ææ¯ä¸ä¸ªå®¢æ·**ï¼å®è®©å°çº¢å¸®å¿è´ä¹°é¦æ°´ï¼**å°çº¢å°±æäºä¸ä¸ªä»£ç对象**ï¼è**馿°´æä¾åæ¯ä¸ä¸ªçå®ç对象**ï¼å¯ä»¥å®å馿°´ï¼å°æéè¿ä»£çåå°çº¢ï¼è´ä¹°å°æ³å½ç馿°´ï¼è¿å°±æ¯ä¸ä¸ªä»£è´çä¾åãæç»äºä¸å¹
å¾å¸®å©çè§£è¿ä¸ªæ
äºçæ´ä¸ªç»æã

è¿ä¸ªæ
äºæ¯æå
¸åçä»£çæ¨¡å¼ï¼ä»£è´ä»ä¾åºåè´ä¹°è´§ç©åè¿åç»è°ç¨è
ï¼ä¹å°±æ¯éè¦ä»£ççå°æã
代çå¯ä»¥å为`éæä»£ç`å`卿代ç`两大类ï¼
**éæä»£ç**
- ä¼ç¹ï¼ä»£ç ç»æç®åï¼è¾å®¹æå®ç°
- 缺ç¹ï¼æ æ³éé
ææä»£çåºæ¯ï¼å¦æææ°çéæ±ï¼éè¦ä¿®æ¹ä»£çç±»ï¼**ä¸ç¬¦å软件工ç¨çå¼éåå**
å°çº¢ç°å¨åªæ¯ä»£ç馿°´ï¼å¦æå°æéè¦æ¾å°çº¢ä¹°æ³å½çº¢é
ï¼é£å°çº¢å°±éè¦ä»£çæ³å½çº¢é
äºï¼ä½æ¯éæä»£ç廿©å±ä»£çåè½**å¿
须修æ¹å°çº¢å
é¨çé»è¾ï¼è¿ä¼è®©å°çº¢å
é¨ä»£ç è¶æ¥è¶èè¿**ï¼åé¢ä¼è¯¦ç»åæã
**卿代ç**
- ä¼ç¹ï¼è½å¤å¨æéé
ç¹å®ç代çåºæ¯ï¼æ©å±æ§è¾å¥½ï¼**符å软件工ç¨çå¼éåå**
- 缺ç¹ï¼å¨æä»£çéè¦å©ç¨å°åå°æºå¶å卿çæåèç ï¼å¯¼è´å
¶æ§è½ä¼æ¯éæä»£çç¨å·®ä¸äºï¼**使¯ç¸æ¯äºä¼ç¹ï¼è¿äºå£å¿å ä¹å¯ä»¥å¿½ç¥ä¸è®¡**
妿尿éè¦æ¾å°çº¢ä»£ç红é
ï¼æä»¬**æ éä¿®æ¹ä»£çç±»å°çº¢çå
é¨é»è¾**ï¼åªéè¦å
³æ³¨æ©å±çåè½ç¹ï¼**代ç红é
**ï¼å®ä¾åæ°çç±»ï¼éè¿ä¸äºè½¬æ¢å³å¯è®©å°çº¢**æ¢è½å¤ä»£ç馿°´ä¹è½å¤ä»£ç红é
**äºã
æ¬æå°ä¼éè¿ä»¥ä¸å ç¹ï¼å°½å¯è½è®©ä½ çè§£ Java 代ç䏿æéè¦çç¥è¯ç¹ï¼
1. å¦ä¹ ä»£çæ¨¡å¼ï¼å®ç°æ
äºç代ç ï¼è§£éä»£çæ¨¡å¼çç±»ç»æç¹ç¹ï¼
2. æ¯è¾éæä»£çä¸å¨æä»£çäºè
çå¼å
3. Java ä¸å¸¸è§ç两ç§å¨æä»£çå®ç°ï¼JDK Proxy å Cglibï¼
4. 卿代ççåºç¨ï¼Spring AOPï¼
## ä»£çæ¨¡å¼
ï¼1ï¼æä»¬å®ä¹å¥½ä¸ä¸ª**å®å馿°´**çæ¥å£ï¼å®ä¹å¥½å®å馿°´çæ¹æ³å¹¶ä¼ å
¥è¯¥é¦æ°´çä»·æ ¼ã
```java
public interface SellPerfume {
void sellPerfume(double price);
}
```
ï¼2ï¼å®ä¹é¦å¥å¿ï¼Chanelï¼é¦æ°´æä¾åï¼å®ç°æ¥å£ã
```java
public class ChanelFactory implements SellPerfume {
@Override
public void sellPerfume(double price) {
System.out.println("æåè´ä¹°é¦å¥å¿åçç馿°´ï¼ä»·æ ¼æ¯ï¼" + price + "å
");
}
}
```
ï¼3ï¼å®ä¹**å°çº¢**代çç±»ï¼å¥¹éè¦ä»£è´å»å®åé¦å¥å¿é¦æ°´ï¼æä»¥å¥¹æ¯é¦å¥å¿é¦æ°´æä¾åç代ç对象ï¼åæ ·å®ç°æ¥å£ï¼å¹¶å¨å
é¨ä¿åå¯¹ç®æ 对象ï¼é¦å¥å¿æä¾åï¼çå¼ç¨ï¼æ§å¶å
¶å®å¯¹è±¡å¯¹ç®æ 对象ç访é®ã
```java
public class XiaoHongSellProxy implements SellPerfume {
private SellPerfume sellPerfumeFactory;
public XiaoHongSellProxy(SellPerfume sellPerfumeFactory) {
this.sellPerfumeFactory = sellPerfumeFactory;
}
@Override
public void sellPerfume(double price) {
doSomethingBeforeSell(); // åç½®å¢å¼º
sellPerfumeFactory.sellPerfume(price);
doSomethingAfterSell(); // åç½®å¢å¼º
}
private void doSomethingBeforeSell() {
System.out.println("å°çº¢ä»£çè´ä¹°é¦æ°´åçé¢å¤æä½...");
}
private void doSomethingAfterSell() {
System.out.println("å°çº¢ä»£çè´ä¹°é¦æ°´åçé¢å¤æä½...");
}
}
```
ï¼4ï¼å°ææ¯ä¸ä¸ªéæ±è
ï¼ä»éè¦å»è´ä¹°é¦æ°´ï¼åªè½éè¿å°çº¢å»è´ä¹°ï¼æä»¥ä»å»æ¾å°çº¢è´ä¹°`1999.99`ç馿°´ã
```java
public class XiaoMing {
public static void main(String[] args) {
ChanelFactory factory = new ChanelFactory();
XiaoHongSellProxy proxy = new XiaoHongSellProxy(factory);
proxy.sellPerfume(1999.99);
}
}
```
æä»¬æ¥ççè¿è¡ç»æï¼å°çº¢å¨åå°æå®å馿°´åå¯ä»¥æ§è¡é¢å¤çå
¶å®æä½ï¼å¦æè¯å¿ç¹ç代è´å°±ä¼**ææãå
é®Â·Â·Â·**ï¼å¦æé»å¿ç¹ç代è´å°±ä¼**å æç»è´¹ãå®åºä¸éè¿Â·Â·Â·**ï¼æ¯ä¸æ¯å¾åºæ¿ã

æä»¬æ¥ççä¸é¢ 4 ä¸ªç±»ç»æçç±»å¾å
³ç³»ç»æï¼å¯ä»¥åç°**å°çº¢**å**é¦å¥å¿æä¾å**é½å®ç°äº**å®å馿°´**è¿ä¸æ¥å£ï¼èå°çº¢å
é¨å¢å äºå¯¹æä¾åçå¼ç¨ï¼ç¨äºè°ç¨æä¾åçå®å馿°´åè½ã

å®ç°ä»£ç模å¼ï¼éè¦èµ°ä»¥ä¸å 个æ¥éª¤ï¼
- **å®ä¹çå®å¯¹è±¡å代ç对象çå
Œ
±æ¥å£**ï¼å®å馿°´æ¥å£ï¼
- **代ç对象å
é¨ä¿å对çå®ç®æ 对象çå¼ç¨**ï¼å°çº¢å¼ç¨æä¾åï¼
- 访é®è
ä»
è½éè¿ä»£ç对象访é®çå®ç®æ 对象ï¼**ä¸å¯ç´æ¥è®¿é®ç®æ 对象**ï¼å°æåªè½éè¿å°çº¢å»è´ä¹°é¦æ°´ï¼ä¸è½ç´æ¥å°é¦å¥å¿æä¾åè´ä¹°ï¼
> ä»£çæ¨¡å¼å¾å®¹æäº§çé误æç»´çä¸ä¸ªå°æ¹ï¼ä»£çå¯¹è±¡å¹¶ä¸æ¯çæ£æä¾æå¡çä¸ä¸ªå¯¹è±¡ï¼å®åªæ¯æ¿è®¿é®è
访é®ç®æ 对象çä¸ä¸ª**ä¸é´äºº**ï¼çæ£æä¾æå¡çè¿æ¯ç®æ 对象ï¼è代ç对象çä½ç¨å°±æ¯å¨ç®æ 对象æä¾æå¡ä¹ååä¹åè½å¤æ§è¡é¢å¤çé»è¾ã
>
> 仿
äºæ¥è¯´ï¼å°çº¢å¹¶ä¸æ¯çæ£å馿°´çï¼å馿°´çè¿æ¯é¦å¥å¿æä¾åï¼èå°çº¢åªä¸è¿æ¯å¨è®©é¦å¥å¿å馿°´ä¹ååä¹åæ§è¡äºä¸äºèªå·±é¢å¤å ä¸å»çæä½ã
讲å®è¿ä¸ªä»£ç模å¼ç代ç å®ç°ï¼æä»¬æ¥ç³»ç»å°å¦ä¹ å®ç©¶ç«æ¯å¦ä½å®ä¹çï¼ä»¥åå®ç°å®éè¦æ³¨æä»ä¹è§èã
ä»£çæ¨¡å¼çå®ä¹ï¼**ç»ç®æ 对象æä¾ä¸ä¸ªä»£ç对象ï¼ä»£ç对象å
å«è¯¥ç®æ 对象ï¼å¹¶æ§å¶å¯¹è¯¥ç®æ 对象ç访é®ã**
ä»£çæ¨¡å¼çç®çï¼
- éè¿ä»£ç对象çé离ï¼å¯ä»¥å¨å¯¹ç®æ 对象访é®åå**å¢å é¢å¤çä¸å¡é»è¾ï¼å®ç°åè½å¢å¼ºã**
- éè¿ä»£ç对象访é®ç®æ 对象ï¼å¯ä»¥**鲿¢ç³»ç»å¤§éå°ç´æ¥å¯¹ç®æ 对象è¿è¡ä¸æ£ç¡®å°è®¿é®**ï¼åºç°ä¸å¯é¢æµçåæ
## éæä»£çä¸å¨æä»£ç
ä½ æ¯å¦ä¼ææä¸æ ·ççæï¼ä»£ç为ä»ä¹è¿è¦åéæå卿çï¼å®ä»¬ä¸¤ä¸ªæå¥ä¸ååï¼
徿æ¾ï¼ææäººé½ä¼æè¿æ ·ççæï¼æä»¬å
æ¥ççå®ä»¬çç¸åç¹ï¼
- é½è½å¤å®ç°ä»£ç模å¼ï¼è¿ä¸åºè¯å...ï¼
- æ 论æ¯éæä»£çè¿æ¯å¨æä»£çï¼ä»£ç对象åç®æ 对象é½éè¦å®ç°ä¸ä¸ª**å
Œ
±æ¥å£**
éç¹å½ç¶æ¯å®ä»¬çä¸åä¹å¤ï¼å¨æä»£çå¨éæä»£ççåºç¡ä¸åäºæ¹è¿ï¼æå¤§å°æé«äºç¨åºç**å¯ç»´æ¤æ§**å**坿©å±æ§**ãæå
ååºå®ä»¬ä¿©çä¸åä¹å¤ï¼å详ç»è§£é为ä½éæä»£çä¸å
·å¤è¿ä¸¤ä¸ªç¹æ§ï¼
- 卿代ç产ç代çå¯¹è±¡çæ¶æºæ¯**è¿è¡æ¶å¨æçæ**ï¼å®æ²¡æ Java æºæä»¶ï¼**ç´æ¥çæåèç æä»¶å®ä¾å代ç对象**ï¼èéæä»£çç代ç对象ï¼å¨**ç¨åºç¼è¯æ¶**å·²ç»å好 Java æä»¶äºï¼ç´æ¥ new ä¸ä¸ªä»£ç对象å³å¯ã
- å¨æä»£çæ¯éæä»£çæ´å 稳å¥ï¼å¯¹ç¨åºçå¯ç»´æ¤æ§å坿©å±æ§æ´å å好
ç®åæ¥çï¼ä»£ç对象å°çº¢å·²ç»è½å¤ä»£çè´ä¹°é¦æ°´äºï¼ä½æä¸å¤©ï¼å°çº¢çå¦å¤ä¸ä¸ªæåå°ä½æ¥äºï¼**仿³è´ä¹°æçº¯æ£çæ³å½çº¢é
**ï¼å½å
没æè¿æ ·çè´ä¹°æ¸ éï¼å°çº¢åå·§ä¹å¨æ³å½ï¼äºæ¯å°ä½å°±æ³æ¾å°çº¢å¸®ä»ä¹°çº¢é
å¦ï¼è¿åå°ææ¾å°çº¢æ¯ä¸ä¸ªéççï¼é½æ¯æ³è®©å°çº¢å代çã
ä½é®é¢æ¯ï¼å¨ç¨åºä¸ï¼å°çº¢åªè½ä»£çè´ä¹°é¦æ°´ï¼**妿è¦ä»£çè´ä¹°çº¢é
**ï¼è¦æä¹åå¢ï¼
- å建å®å红é
çæ¥å£
- å®å红é
æä¾åå代ç对象å°çº¢é½éè¦å®ç°è¯¥æ¥å£
- å°ä½è®¿é®å°çº¢ï¼è®©å°çº¢åç»ä»çº¢é

OKï¼äºå·²è³æ¤ï¼ä»£ç å°±ä¸éå¤åäºï¼æä»¬æ¥æ¢è®¨ä¸ä¸ï¼é¢å¯¹è¿ç§æ°å¢çåºæ¯ï¼ä¸é¢çè¿ç§å®ç°æ¹æ³ææ²¡æä»ä¹ç¼ºé·å¢ï¼
æä»¬ä¸å¾ä¸æçæ¯è½¯ä»¶å·¥ç¨ä¸ç**å¼éåå**
> å¼éååï¼å¨ç¼åç¨åºçè¿ç¨ä¸ï¼è½¯ä»¶çææå¯¹è±¡åºè¯¥æ¯å¯¹æ©å±æ¯å¼æ¾çï¼èå¯¹ä¿®æ¹æ¯å
³éç
éæä»£çè¿åäºå¼éååï¼åå æ¯ï¼é¢å¯¹æ°çéæ±æ¶ï¼éè¦ä¿®æ¹ä»£çç±»ï¼å¢å å®ç°æ°çæ¥å£åæ¹æ³ï¼å¯¼è´ä»£çç±»è¶æ¥è¶åºå¤§ï¼åå¾é¾ä»¥ç»´æ¤ã
è½ç¶è¯´ç®å代çç±»åªæ¯å®ç°äº2个æ¥å£ï¼**妿æ¥åå°çº¢ä¸åªæ¯ä»£çå®å红é
ï¼è¿éè¦ä»£çå®åçµå½±ç¥¨ãä»£è´æ¥æ¬å¯¿å¸Â·Â·Â·Â·Â·Â·**å®ç°çæ¥å£ä¼åå¾è¶æ¥è¶å¤ï¼å
é¨çç»æåå¾è¶æ¥è¶å¤æï¼**æ´ä¸ªç±»æ¾å¾æåèè¿**ï¼åå¾ä¸å¯ç»´æ¤ï¼ä¹åçæ©å±ä¹ä¼æé®é¢ï¼åªè¦ä»»æä¸ä¸ªæ¥å£ææ¹å¨ï¼å°±ä¼çµæ¯å°è¿ä¸ªä»£çç±»ï¼ç»´æ¤ç代价å¾é«ã
**æä»¥ï¼ä¸ºäºæé«ç±»ç坿©å±æ§åå¯ç»´æ¤æ§ï¼æ»¡è¶³å¼éååï¼Java æä¾äºå¨æä»£çæºå¶ã**
## 常è§ç卿代çå®ç°
卿代çæéè¦çå½ç¶æ¯**卿**两个åï¼å¦ä¹ 卿代ççè¿ç¨ï¼æéè¦çå°±æ¯çè§£ä½ä¸ºå¨æï¼è¯ä¸å¤è¯´ï¼é©¬ä¸å¼æ´ã
æä»¬æ¥æç¡®ä¸ç¹ï¼**卿代çè§£å³çé®é¢æ¯é¢å¯¹æ°çéæ±æ¶ï¼ä¸éè¦ä¿®æ¹ä»£ç对象ç代ç ï¼åªéè¦æ°å¢æ¥å£åçå®å¯¹è±¡ï¼å¨å®¢æ·ç«¯è°ç¨å³å¯å®ææ°ç代çã**
è¿æ ·åçç®çï¼æ»¡è¶³è½¯ä»¶å·¥ç¨çå¼éååï¼æé«ç±»çå¯ç»´æ¤æ§å坿©å±æ§ã
### JDK Proxy
JDK Proxy æ¯ JDK æä¾çä¸ä¸ªå¨æä»£çæºå¶ï¼å®æ¶åå°ä¸¤ä¸ªæ ¸å¿ç±»ï¼å嫿¯`Proxy`å`InvocationHandler`ï¼æä»¬å
æ¥äºè§£å¦ä½ä½¿ç¨å®ä»¬ã
以å°çº¢ä»£çå馿°´çæ
äºä¸ºä¾ï¼é¦å¥å¿é¦æ°´æä¾å便§æ¯çå®å¯¹è±¡ï¼å®ç°äº`SellPerfume`æ¥å£ï¼è¿éä¸åéæ°åäºï¼éç¹æ¯**å°çº¢ä»£ç**ï¼è¿éç代ç对象ä¸åæ¯å°çº¢ä¸ä¸ªäººï¼èæ¯ä¸ä¸ª**代çå·¥å**ï¼éé¢ä¼æè®¸å¤ç代ç对象ãæç»äºä¸å¹
å¾ï¼ä½ çäºä¹åä¼å¾å¥½çè§£ï¼

å°ææ¥å°ä»£çå·¥åï¼éè¦è´ä¹°ä¸æ¬¾æ³å½å¨å®çé¦å¥å¿é¦æ°´ï¼é£ä¹å·¥åå°±ä¼**æ¾ä¸ä¸ªå¯ä»¥å®é
ç代ç对象ï¼å¨æå®ä¾åï¼**åé
ç»å°æï¼ä¾å¦å°çº¢æè
å°è±ï¼è®©è¯¥ä»£çå¯¹è±¡å®æå°æçéæ±ã**该代çå·¥å嫿æ ç©·æ å°½ç代ç对象å¯ä»¥åé
ï¼ä¸æ¯ä¸ªå¯¹è±¡å¯ä»¥ä»£ççäºæ
å¯ä»¥æ ¹æ®ç¨åºçååè卿ååï¼æ éä¿®æ¹ä»£çå·¥åã**
妿æä¸å¤©å°æéè¦æå¾
ä¸ä¸ªå¯ä»¥**代è´çº¢é
**ç代ç对象ï¼è¯¥ä»£çå·¥å便§å¯ä»¥æ»¡è¶³ä»çéæ±ï¼æ 论æ¥åéè¦ä»ä¹ä»£çï¼é½å¯ä»¥æ»¡è¶³ï¼æ¯ä¸æ¯è§å¾å¾ç¥å¥ï¼æä»¬æ¥å¦ä¹ å¦ä½ä½¿ç¨å®ã
æä»¬çä¸ä¸å¨æä»£çç UML ç±»å¾ç»æé¿ä»ä¹æ ·åã

å¯ä»¥çå°åéæä»£çåºå«ä¸å¤§ï¼å¯ä¸çå卿¯ä»£çå¯¹è±¡ï¼æåäºæ 注ï¼**ç±ä»£çå·¥åç产**ã
è¿å¥è¯çæææ¯ï¼**代ç对象æ¯å¨ç¨åºè¿è¡è¿ç¨ä¸ï¼ç±ä»£çå·¥å卿çæï¼ä»£ç对象æ¬èº«ä¸åå¨ Java æºæä»¶**ã
é£ä¹ï¼æä»¬çå
³æ³¨ç¹æ`2`个ï¼
- å¦ä½å®ç°ä¸ä¸ªä»£çå·¥å
- å¦ä½éè¿ä»£çå·¥å卿çæä»£ç对象
é¦å
ï¼ä»£çå·¥åéè¦å®ç°`InvocationHanlder`æ¥å£å¹¶å®ç°å
¶`invoke()`æ¹æ³ã
```java
public class SellProxyFactory implements InvocationHandler {
/** 代çççå®å¯¹è±¡ */
private Object realObject;
public SellProxyFactory(Object realObject) {
this.realObject = realObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doSomethingBefore();
Object obj = method.invoke(realObject, args);
doSomethingAfter();
return obj;
}
private void doSomethingAfter() {
System.out.println("æ§è¡ä»£çåçé¢å¤æä½...");
}
private void doSomethingBefore() {
System.out.println("æ§è¡ä»£çåçé¢å¤æä½...");
}
}
```
invoke() æ¹æ³æ`3`ä¸ªåæ°ï¼
- `Object proxy`ï¼ä»£ç对象
- `Method method`ï¼çæ£æ§è¡çæ¹æ³
- `Object[] agrs`ï¼è°ç¨ç¬¬äºä¸ªåæ° method æ¶ä¼ å
¥çåæ°å表å¼
invoke() æ¹æ³æ¯ä¸ä¸ªä»£çæ¹æ³ï¼ä¹å°±æ¯è¯´æå客æ·ç«¯è¯·æ±ä»£çæ¶ï¼æ§è¡çå°±æ¯è¯¥æ¹æ³ã代çå·¥åç±»å°è¿é为æ¢å·²ç»ç»æäºï¼æä»¬æ¥ä¸æ¥ç第äºç¹ï¼**å¦ä½éè¿ä»£çå·¥å卿çæä»£ç对象**ã
çæä»£ç对象éè¦ç¨å°`Proxy`ç±»ï¼å®å¯ä»¥å¸®å©æä»¬çæä»»æä¸ä¸ªä»£ç对象ï¼é颿ä¾ä¸ä¸ªéææ¹æ³`newProxyInstance`ã
```java
Proxy.newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h);
```
å®ä¾å代ç对象æ¶ï¼éè¦ä¼ å
¥`3`ä¸ªåæ°ï¼
- ClassLoader loaderï¼å è½½å¨æä»£çç±»çç±»å è½½å¨
- Class>[] interfacesï¼ä»£çç±»å®ç°çæ¥å£ï¼å¯ä»¥ä¼ å
¥å¤ä¸ªæ¥å£
- InvocationHandler hï¼æå®ä»£çç±»ç**è°ç¨å¤çç¨åº**ï¼å³è°ç¨æ¥å£ä¸çæ¹æ³æ¶ï¼ä¼æ¾å°è¯¥ä»£çå·¥å`h`ï¼æ§è¡`invoke()`æ¹æ³
æä»¬å¨å®¢æ·ç«¯è¯·æ±ä»£çæ¶ï¼å°±éè¦ç¨å°ä¸é¢è¿ä¸ªæ¹æ³ã
```java
public class XiaoMing {
public static void main(String[] args) {
ChanelFactory chanelFactory = new ChanelFactory();
SellProxyFactory sellProxyFactory = new SellProxyFactory(chanelFactory);
SellPerfume sellPerfume = (SellPerfume) Proxy.newProxyInstance(chanelFactory.getClass().getClassLoader(),
chanelFactory.getClass().getInterfaces(),
sellProxyFactory);
sellPerfume.sellPerfume(1999.99);
}
}
```
æ§è¡ç»æåéæä»£ççç»æç¸åï¼ä½äºè
çææ³æ¯ä¸ä¸æ ·çï¼ä¸ä¸ªæ¯éæï¼ä¸ä¸ªæ¯å¨æãé£åå¦ä½ä½ç°åºå¨æä»£ççä¼å¿å¢ï¼å«æ¥ï¼å¾ä¸çå°±ç¥éäºã
> 注æçä¸å¾ï¼ç¸æ¯`éæä»£ç`çåç½®å¢å¼ºååç½®å¢å¼ºï¼å°äº**å°çº¢**äºåï¼å®é
ä¸ä»£çå·¥ååé
ç代ç对象æ¯éæºçï¼ä¸ä¼é对æä¸ä¸ªå
·ä½ç代çå¯¹è±¡ï¼æä»¥æ¯æ¬¡çæç代ç对象é½ä¸ä¸æ ·ï¼ä¹å°±ä¸ç¡®å®æ¯ä¸æ¯å°çº¢äºï¼ä½æ¯è½å¤å¯ä¸ç¡®å®çæ¯ï¼**è¿ä¸ªä»£ç对象è½åå°çº¢ä¸æ ·å¸®å°æä¹°å°é¦æ°´ï¼**

æç
§ä¹åçæ
äºçº¿åå±ï¼å°çº¢å»ä»£ç红é
ï¼è**尿忳买æ³å½çåç红é
**ï¼æä»¥å»æ¾ä»£çå·¥åï¼è®©å®ååé
ä¸ä¸ªäººå¸®å°æä¹°çº¢é
ï¼ä»£çå·¥å说ï¼âå½ç¶æ²¡é®é¢ï¼æä»¬æ¯ä¸ä¸çï¼ççï¼â
æä»¬éè¦å®ç°ä¸¤ä¸ªç±»ï¼çº¢é
æä¾åç±» å å®å红é
æ¥å£ã
```Java
/** å®å红é
æ¥å£ */
public interface SellWine {
void sellWine(double price);
}
/** 红é
ä¾åºå */
public class RedWineFactory implements SellWine {
@Override
public void sellWine(double price) {
System.out.println("æåå®åä¸ç¶çº¢é
ï¼ä»·æ ¼ï¼" + price + "å
");
}
}
```
ç¶åæä»¬çå°æå¨è¯·æ±ä»£ç工忶ï¼å°±å¯ä»¥**å®ä¾åä¸ä¸ªå¯ä»¥å®å红é
ç代ç**äºã
```java
public class XiaoMing {
public static void main(String[] args) {
// å®ä¾åä¸ä¸ªçº¢é
éå®å
RedWineFactory redWineFactory = new RedWineFactory();
// å®ä¾å代çå·¥åï¼ä¼ å
¥çº¢é
éå®åå¼ç¨æ§å¶å¯¹å
¶ç访é®
SellProxyFactory sellProxyFactory = new SellProxyFactory(redWineFactory);
// å®ä¾å代ç对象ï¼è¯¥å¯¹è±¡å¯ä»¥ä»£çå®å红é
SellWine sellWineProxy = (SellWine) Proxy.newProxyInstance(redWineFactory.getClass().getClassLoader(),
redWineFactory.getClass().getInterfaces(),
sellProxyFactory);
// 代çå®å红é
sellWineProxy.sellWine(1999.99);
}
}
```
æå¾
ä¸ä¸æ§è¡ç»æï¼ä½ ä¼å¾æåå°åç°ï¼å±
ç¶ä¹è½å¤ä»£çå®å红é
äºï¼ä½æ¯æä»¬**没æä¿®æ¹ä»£çå·¥å**ã

å顾ä¸ä¸æä»¬æ°å¢çº¢é
代çåè½æ¶ï¼éè¦`2`个æ¥éª¤ï¼
- å建æ°ç红é
æä¾å`SellWineFactory`åå®å红é
æ¥å£`SellWine`
- å¨å®¢æ·ç«¯å®ä¾åä¸ä¸ªä»£ç对象ï¼ç¶åå该代ç对象è´ä¹°çº¢é
ååæ³**å¼éååï¼é¢åæ©å±å¼æ¾ï¼é¢åä¿®æ¹å
³é**ãå¨æä»£çæ£æ¯æ»¡è¶³äºè¿ä¸éè¦ååï¼å¨é¢å¯¹åè½éæ±æ©å±æ¶ï¼åªéè¦å
³æ³¨æ©å±çé¨åï¼ä¸éè¦ä¿®æ¹ç³»ç»ä¸åæç代ç ã
妿æå
´è¶£æ³æ·±ç©¶çæåï¼ææ³¨æåæ¾å¨`Proxy.newProxyInstance()`è¿ä¸ªæ¹æ³ä¸ï¼è¿æ¯æ´ä¸ª JDK 卿代çèµ·é£çä¸ä¸ªæ¹æ³ã
讲å°è¿éï¼JDK æä¾ç卿代çå·²ç»å°å°¾å£°äºï¼æä»¬æ¥æ»ç»ä¸ä¸ JDK ç卿代çï¼
ï¼1ï¼JDK 卿代ççä½¿ç¨æ¹æ³
- 代çå·¥åéè¦å®ç° `InvocationHandler`æ¥å£ï¼è°ç¨ä»£çæ¹æ³æ¶ä¼è½¬åæ§è¡`invoke()`æ¹æ³
- çæä»£ç对象éè¦ä½¿ç¨`Proxy`对象ä¸ç`newProxyInstance()`æ¹æ³ï¼è¿å对象å¯å¼ºè½¬æä¼ å
¥çå
¶ä¸ä¸ä¸ªæ¥å£ï¼ç¶åè°ç¨æ¥å£æ¹æ³å³å¯å®ç°ä»£ç
ï¼2ï¼JDK 卿代ççç¹ç¹
- ç®æ 对象强å¶éè¦å®ç°ä¸ä¸ªæ¥å£ï¼å¦åæ æ³ä½¿ç¨ JDK 卿代ç
**ï¼ä»¥ä¸ä¸ºæ©å±å
容ï¼å¦æä¸æ³çå¯è·³è¿ï¼**
Proxy.newProxyInstance() æ¯çæå¨æä»£ç对象çå
³é®ï¼æä»¬å¯æ¥ççå®éé¢å°åºå¹²äºäºä»ä¹ï¼ææéè¦çä»£ç æååºæ¥ï¼ä¸äºå¯¹åææ ç¨ç代ç å°±çç¥æäºã
```java
private static final Class>[] constructorParams ={ InvocationHandler.class };
public static Object newProxyInstance(ClassLoader loader,
Class>[] interfaces,
InvocationHandler h) {
// è·å代çç±»ç Class 对象
Class> cl = getProxyClass0(loader, intfs);
// è·å代çå¯¹è±¡çæ¾ç¤ºæé å¨ï¼åæ°ç±»åæ¯ InvocationHandler
final Constructor> cons = cl.getConstructor(constructorParams);
// åå°ï¼éè¿æé å¨å®ä¾å卿代ç对象
return cons.newInstance(new Object[]{h});
}
```
æä»¬çå°ç¬¬ `6` è¡è·åäºä¸ä¸ªå¨æä»£ç对象ï¼é£ä¹æ¯å¦ä½çæçå¢ï¼æ¥çå¾ä¸çã
```java
private static Class> getProxyClass0(ClassLoader loader,
Class>... interfaces) {
// å»ä»£ç类对象ç¼åä¸è·å代çç±»ç Class 对象
return proxyClassCache.get(loader, interfaces);
}
```
åç°éé¢ç¨å°ä¸ä¸ªç¼å **proxyClassCache**ï¼ä»ç»ææ¥çç±»ä¼¼äºæ¯ä¸ä¸ª `map` ç»æï¼æ ¹æ®ç±»å è½½å¨`loader`åçå®å¯¹è±¡å®ç°çæ¥å£`interfaces`æ¥æ¾æ¯å¦æå¯¹åºç Class å¯¹è±¡ï¼æä»¬æ¥çå¾ä¸ç `get()` æ¹æ³ã
```java
public V get(K key, P parameter) {
// å
ä»ç¼å䏿¥è¯¢æ¯å¦è½æ ¹æ® key å parameter æ¥è¯¢å° Class 对象
// ...
// çæä¸ä¸ªä»£çç±»
Object subKey = Objects.requireNonNull(subKeyFactory.apply(key, parameter));
}
```
å¨ get() æ¹æ³ä¸ï¼å¦ææ²¡æä»ç¼åä¸è·åå° Class 对象ï¼åéè¦å©ç¨ **subKeyFactory** å»å®ä¾åä¸ä¸ªå¨æä»£ç对象ï¼èå¨ **Proxy** ç±»ä¸å
å«ä¸ä¸ª **ProxyClassFactory** å
é¨ç±»ï¼ç±å®æ¥å建ä¸ä¸ªå¨æä»£çç±»ï¼æä»¥æä»¬æ¥çå»ç ProxyClassFactory ä¸ç `apply()` æ¹æ³ã
```java
private static final class ProxyClassFactory
implements BiFunction