# Java 卿代ç
* [Java 卿代ç](#java-卿代ç)
* [ä»£çæ¨¡å¼](#ä»£çæ¨¡å¼)
* [éæä»£ç](#éæä»£ç)
* [卿代ç](#卿代ç)
* [JDK 卿代ç](#jdk-卿代ç)
* [CGLIB 卿代ç](#cglib-卿代ç)
* [Javassist 代ç](#javassist-代ç)
* [ASM 代ç](#asm-代ç)
è¿ç¯æç« æä»¬æ¥èä¸ä¸ Java ä¸ç卿代çã
卿代çå¨ Java 䏿ç广æ³çåºç¨ï¼æ¯å¦ **AOP çå®ç°åçãRPCè¿ç¨è°ç¨ãJava 注解对象è·åãæ¥å¿æ¡æ¶ãå
¨å±æ§å¼å¸¸å¤çãäºå¡å¤çç**ã
å¨äºè§£å¨æä»£çåï¼æä»¬éè¦å
äºè§£ä¸ä¸ä»ä¹æ¯ä»£ç模å¼ã
## ä»£çæ¨¡å¼
`ä»£çæ¨¡å¼(Proxy Pattern)`æ¯ 23 ç§è®¾è®¡æ¨¡å¼çä¸ç§ï¼å±äº`ç»æåæ¨¡å¼`ãä»æçæ¯ä¸ä¸ªå¯¹è±¡æ¬èº«ä¸åå®é
çæä½ï¼èæ¯éè¿å
¶ä»å¯¹è±¡æ¥å¾å°èªå·±æ³è¦çç»æãè¿æ ·åç好夿¯å¯ä»¥å¨**ç®æ 对象å®ç°çåºç¡ä¸ï¼å¢å¼ºé¢å¤çåè½æä½ï¼å³æ©å±ç®æ 对象çåè½**ã
>è¿éè½ä½ç°åºä¸ä¸ªé常éè¦çç¼ç¨ææ³ï¼ä¸è¦éæå»æ¹æºç ï¼å¦æéè¦ä¿®æ¹ï¼å¯ä»¥éè¿ä»£ççæ¹å¼æ¥æ©å±è¯¥æ¹æ³ã
å¦ä¸å¾æç¤ºï¼ç¨æ·ä¸è½ç´æ¥ä½¿ç¨ç®æ 对象ï¼èæ¯æé åºä¸ä¸ªä»£ç对象ï¼ç±ä»£ç对象ä½ä¸ºä¸è½¬ï¼ä»£ç对象è´è´£è°ç¨ç®æ å¯¹è±¡çæ£çè¡ä¸ºï¼ä»èæç»æè¿åç»ç¨æ·ã
ä¹å°±æ¯è¯´ï¼ä»£ççå
³é®ç¹å°±æ¯**代ç对象åç®æ 对象çå
³ç³»**ã
代çå
¶å®å°±åç»çºªäººä¸æ ·ï¼æ¯å¦ä½ æ¯ä¸ä¸ªææï¼æå¾å¤ç²ä¸ãä½ çæµéå¾å¤ï¼ç»å¸¸ä¼æå¾å¤éä¸»æ¥æ¾ä½ æ´½è°åä½çï¼ä½ èªå·±è¯å®å¿ä¸è¿æ¥ï¼å ä¸ºä½ è¦å¤ççä¸åªæ¯è°åä½è¿ä»¶äºæ
ï¼ä½ è¿è¦ææèºãææãç»´æ¤åç²ä¸çå
³ç³»ãè¥éçã为æ¤ï¼ä½ æ¾äºä¸ä¸ªç»çºªäººï¼ä½ 让ä»è´è´£åé主è°åä½è¿ä»¶äºï¼ç»çºªäººåäºå¾è®¤çè´è´£ï¼å®å满ç宿äºä»»å¡ï¼äºæ¯ï¼é主æ¾ä½ è°åä½å°±åæäºé主åä½ çç»çºªäººè°åä½ï¼ä½ å°±ææ´å¤çæ¶é´æ¥å¿å
¶ä»äºæ
äºãå¦ä¸å¾æç¤º

è¿æ¯ä¸ç§éæä»£çï¼å 为è¿ä¸ª`代ç(ç»çºªäºº)`æ¯ä½ èªå·±äº²èªæéçã
使¯åæ¥éçä½ çä¸å¡éæ¸æå±ï¼ä½ æ æ³éæ©æ¯ä¸ªç»çºªäººï¼æä»¥ä½ ç´¢æ§äº¤ç»äºä»£çå
¬å¸æ¥å¸®ä½ åãå¦æä½ æ³å¨ B ç«ç«ä¸æï¼é£å°±ç´æ¥è®©ä»£çå
¬å¸å¸®ä½ æ¾å°è´è´£è¥éæ¹é¢ç代ç人ï¼å¦æä½ æ³ç»´æ¤åç²ä¸çå
³ç³»ï¼é£ä½ ç´æ¥è®©ä»£çå
¬å¸ç»ä½ æ¾ä¸äºæå¿å°±å¯ä»¥äºï¼é£ä¹æ¤æ¶çå
³ç³»å¾ä¼å为å¦ä¸

æ¤æ¶ä½ å 乿æçå·¥ä½é½æ¯ç±ä»£çå
¬å¸æ¥è¿è¡æçï¼èä»ä»¬æ´¾åºè°æ¥å¸®ä½ åè¿äºäºæ
ä½ å°±ä¸å¾èç¥äºï¼è¿å¾æ ¹æ®å®é
æ
嵿¥å®ï¼å 为代çå
¬å¸ä¹ä¸åªæ¯è´è´£ä½ ä¸ä¸ªææï¼è䏿¯ä¸ªäººææ
é¿çé¢åä¹ä¸åï¼æä»¥ä½ åªæçå°æå®é
éæ±åï¼æä¼ç»ä½ æå®å¯¹åºç代ç人ï¼è¿ç§æ
åµå°±å«å`卿代ç`ã
## éæä»£ç
ä»ç¼è¯ææ¯å¦è½ç¡®å®æç»çæ§è¡æ¹æ³å¯ä»¥æä»£ç模å¼å为éæä»£çå卿代çï¼æä»¬å
æ¼ç¤ºä¸ä¸å¨æä»£çï¼è¿éæä¸ä¸ªéæ±ï¼é¢å¯¼æ³å¨ç³»ç»ä¸æ·»å ä¸ä¸ªç¨æ·ï¼ä½æ¯ä»ä¸èªå·±æ·»å ï¼ä»è®©ä¸é¢çç¨åºåæ¥æ·»å ï¼æä»¬çä¸ä¸è¿ä¸ªè¿ç¨ã
é¦å
æå»ºä¸ä¸ªç¨æ·æ¥å£ï¼å®ä¹ä¸ä¸ªä¿åç¨æ·çæ¨¡çæ¹æ³ã
```java
public interface UserDao {
void saveUser();
}
```
æå»ºä¸ä¸ªç¨æ·å®ç°ç±»ï¼è¿ä¸ªç¨æ·å®ç°ç±»æ¯çæ£è¿è¡ç¨æ·æä½çæ¹æ³
```java
public class UserDaoImpl implements UserDao{
@Override
public void saveUser() {
System.out.println(" ---- ä¿åç¨æ· ---- ");
}
}
```
æå»ºä¸ä¸ªç¨æ·ä»£çç±»ï¼ç¨æ·ä»£çç±»ä¹æä¸ä¸ªä¿åç¨æ·çæ¹æ³ï¼ä¸è¿è¿ä¸ªæ¹æ³å±äºä»£çæ¹æ³ï¼å®ä¸ä¼æ§è¡çæ£çä¿åç¨æ·ï¼èæ¯å
鍿æä¸ä¸ªçæ£çç¨æ·å¯¹è±¡ï¼è¿è¡ç¨æ·ä¿åã
```java
public class UserProxy {
private UserDao userDao;
public UserProxy(UserDao userDao){
this.userDao = userDao;
}
public void saveUser() {
System.out.println(" ---- 代çå¼å§ ---- ");
userDao.saveUser();
System.out.println(" ---- 代çç»æ ----");
}
}
```
ä¸é¢æ¯æµè¯æ¹æ³ã
```java
public class UserTest {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
UserProxy userProxy = new UserProxy(userDao);
userProxy.saveUser();
}
}
```
æ°å建ä¸ä¸ªç¨æ·å®ç°ç±» ï¼UserDaoImplï¼ï¼å®ä¸æ§è¡ç¨æ·æä½ãç¶ååå建ä¸ä¸ªç¨æ·ä»£çï¼UserProxyï¼ï¼æ§è¡ç¨æ·ä»£ççç¨æ·ä¿åï¼saveUserï¼ï¼å
¶å
é¨ä¼è°ç¨ç¨æ·å®ç°ç±»çä¿åç¨æ·ï¼saveUserï¼æ¹æ³ï¼å 为æä»¬ JVM å¯ä»¥å¨ç¼è¯æç¡®å®æç»çæ§è¡æ¹æ³ï¼æä»¥ä¸é¢çè¿ç§ä»£ç模å¼åå«å`éæä»£ç`ã
**ä»£çæ¨¡å¼å
·ææ ä¾µå
¥æ§çä¼ç¹**ï¼ä»¥åæä»¬å¢å ä»ä¹æ°åè½çè¯ï¼æä»¬å¯ä»¥ç´æ¥å¢å ä¸ä¸ªä»£çç±»ï¼è®©ä»£çç±»æ¥è°ç¨ç¨æ·æä½ï¼è¿æ ·æä»¬å°±å®ç°äºä¸éè¿æ¹æºç çæ¹å¼å¢å äºæ°çåè½ãç¶åçæ´»å¾ç¾å¥½äºï¼æä»¬è½å¤ç´æ¥æ·»å æä»¬æ³è¦çåè½ï¼å¨è¿`ç¾ä¸½`çæ¥åéï¼cxuan æ·»å äºç¨æ·ä»£çãæ¥å¿ä»£çççæ æ°ä¸ªä»£çç±»ã使¯å¥½æ¯ä¸é¿ï¼cxuan åç°æ¯æ¬¡æ¹ä»£ç çæ¶åé½è¦æ¹æ¯ä¸ªä»£çç±»ï¼è¿å°±å¾ç¦åï¼æå®è´µçæ¶å
齿µªè´¹å¨æ¹æ¯ä¸ªä»£çç±»ä¸é¢äºåï¼
## 卿代ç
### JDK 卿代ç
äºæ¯ä¹ cxuan ä¸ç½æ±å©ï¼åç°äºä¸ä¸ªå«å卿代ççæ¦å¿µï¼é读äºä¸ä¸ï¼åç°æç¹ææï¼äºæ¯ä¹ cxuan ä¿®æ¹äºä¸ä¸éæä»£çç代ç ï¼æ°å¢äºä¸ä¸ª `UserHandler` çç¨æ·ä»£çï¼å¹¶åäºä¸ä¸ `test`ï¼ä»£ç å¦ä¸
```java
public class UserHandler implements InvocationHandler {
private UserDao userDao;
public UserHandler(UserDao userDao){
this.userDao = userDao;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
saveUserStart();
Object obj = method.invoke(userDao, args);
saveUserDone();
return obj;
}
public void saveUserStart(){
System.out.println("---- å¼å§æå
¥ ----");
}
public void saveUserDone(){
System.out.println("---- æå
¥å®æ ----");
}
}
```
æµè¯ç±»å¦ä¸
```java
public static void dynamicProxy(){
UserDao userDao = new UserDaoImpl();
InvocationHandler handler = new UserHandler(userDao);
ClassLoader loader = userDao.getClass().getClassLoader();
Class>[] interfaces = userDao.getClass().getInterfaces();
UserDao proxy = (UserDao)Proxy.newProxyInstance(loader, interfaces, handler);
proxy.saveUser();
}
```
`UserHandler` æ¯ç¨æ·ä»£çç±»ï¼æé 彿°ä¸ç UserDao æ¯çå®å¯¹è±¡ï¼éè¿æ UserDao éèè¿ UserHandler ï¼éè¿ UserHandler ä¸ç UserDao æ§è¡çæ£çæ¹æ³ã
ç±»å è½½å¨ãæ¥å£æ°ç»ä½ å¯ä»¥æå®ç解为ä¸ä¸ªæ¹æ³æ ï¼æ¯æ£µå¶åç»ç¹é½æ¯ä¸ä¸ªæ¹æ³ï¼éè¿åé¢ç proxy.saveUser() æ¥åè¯ JVM æ§è¡çæ¯æ¹æ³æ ä¸çåªä¸ªæ¹æ³ã
ç¨æ·ä»£çæ¯éè¿ç±»å è½½å¨ãæ¥å£æ°ç»ã代çç±»æ¥å¾å°çãsaveUser æ¹æ³å°±ç¸å½äºæ¯åè¯ proxy ä½ æç»è¦æ§è¡çæ¯åªä¸ªæ¹æ³ï¼è¿ä¸ª proxy.saveUser æ¹æ³å¹¶ä¸æ¯æç»ç´æ¥æ§è¡ç saveUser æ¹æ³ï¼æç»ç saveUser æ¹æ³æ¯ç± UserHandler ä¸ç invoke æ¹æ³è§¦åçã
ä¸é¢è¿ç§å¨ç¼è¯ææ æ³ç¡®å®æç»çæ§è¡æ¹æ³ï¼èåªè½éè¿è¿è¡æ¶å¨æè·åæ¹æ³çä»£çæ¨¡å¼è¢«ç§°ä¸º `卿代ç`ã
卿代ççä¼å¿æ¯å®ç°`æ ä¾µå
¥å¼`çä»£ç æ©å±ï¼ä¹å¯ä»¥å¯¹æ¹æ³è¿è¡å¢å¼ºãæ¤å¤ï¼ä¹å¯ä»¥å¤§å¤§åå°ä»£ç éï¼é¿å
代çç±»æ³æ»¥æç¾çæ
åµã
æä»¥æä»¬ç°å¨æ»ç»ä¸ä¸éæä»£çå卿代çåèªçç¹ç¹ã
**éæä»£ç**
- éæä»£çç±»ï¼ç±ç¨åºåå建æè
ç±ç¬¬ä¸æ¹å·¥å
·çæï¼åè¿è¡ç¼è¯ï¼å¨ç¨åºè¿è¡ä¹åï¼ä»£çç±»ç .class æä»¶å·²ç»åå¨äºã
- éæä»£çäºå
ç¥éè¦ä»£ççæ¯ä»ä¹ã
- éæä»£çç±»é常åªä»£çä¸ä¸ªç±»ã
**卿代ç**
- 卿代çé常æ¯å¨ç¨åºè¿è¡æ¶ï¼éè¿`åå°æºå¶`卿çæçã
- 卿代çç±»é常代ç`æ¥å£`ä¸çææç±»ã
- 卿代çäºå
ä¸ç¥éè¦ä»£ççæ¯ä»ä¹ï¼åªæå¨è¿è¡çæ¶åæè½ç¡®å®ã
- 卿代ççè°ç¨å¤çç¨åºå¿
é¡»äºå
ç»§æ¿ InvocationHandler æ¥å£ï¼ä½¿ç¨ Proxy ç±»ä¸ç newProxyInstance æ¹æ³å¨æçå建代çç±»ã
å¨ä¸é¢ç代ç 示ä¾ä¸ï¼æä»¬æ¯å®ä¹äºä¸ä¸ª UserDao æ¥å£ï¼ç¶åæ UserDaoImpl æ¥å£çå®ç°ç±»ï¼æä»¬éè¿ Proxy.newProxyInstance æ¹æ³å¾å°ç乿¯ UserDao çå®ç°ç±»å¯¹è±¡ï¼é£ä¹å
¶å®è¿æ¯ä¸ç§**åºäºæ¥å£ç卿代ç**ãä¹å«å `JDK 卿代ç`ã
>æ¯ä¸æ¯åªæè¿ä¸ç§å¨æä»£çææ¯å¢ï¼æ¢ç¶é½è¿ä¹é®äºï¼é£å½ç¶ä¸æ¯ã
餿¤ä¹å¤ï¼è¿æä¸äºå
¶ä»ä»£çææ¯ï¼ä¸è¿æ¯éè¦å è½½é¢å¤ç jar å
çï¼é£ä¹æä»¬æ±æ»ä¸ä¸ææçä»£çææ¯åå®çç¹å¾
* JDK ç卿代ç使ç¨ç®åï¼å®å
ç½®å¨ JDK ä¸ï¼å æ¤ä¸éè¦å¼å
¥ç¬¬ä¸æ¹ Jar å
ã
* CGLIB å Javassist 齿¯é«çº§çåèç çæåºï¼æ»ä½æ§è½æ¯ JDK èªå¸¦ç卿代ç好ï¼èä¸åè½åå强大ã
* ASM æ¯ä½çº§çåèç çæå·¥å
·ï¼ä½¿ç¨ ASM å·²ç»è¿ä¹äºå¨ä½¿ç¨åèç ç¼ç¨ï¼å¯¹å¼å人åè¦æ±æé«ãå½ç¶ï¼ä¹æ¯`æ§è½æå¥½`çä¸ç§å¨æä»£ççæå·¥å
·ãä½ ASM ç使ç¨å¾ç¹çï¼è䏿§è½ä¹æ²¡ææ°é级çæåï¼ä¸ CGLIB çé«çº§åèç çæå·¥å
·ç¸æ¯ï¼ASM ç¨åºçç»´æ¤æ§è¾å·®ï¼å¦æä¸æ¯å¨å¯¹æ§è½æèå»è¦æ±çåºåï¼è¿æ¯æ¨è CGLIB æè
Javassistã
ä¸é¢æä»¬å°±æ¥ä¾æ¬¡ä»ç»ä¸ä¸è¿äºå¨æä»£çå·¥å
·ç使ç¨
### CGLIB 卿代ç
ä¸é¢æä»¬æå° JDK å¨æä»£çæ¯åºäºæ¥å£ç代çï¼è CGLIB 卿代ç**æ¯é对类å®ç°ä»£çï¼ä¸»è¦æ¯å¯¹æå®çç±»çæä¸ä¸ªåç±»ï¼è¦çå
¶ä¸çæ¹æ³** ï¼ä¹å°±æ¯è¯´ CGLIB 卿代çéç¨ç±»ç»§æ¿ -> æ¹æ³éåçæ¹å¼è¿è¡çï¼ä¸é¢æä»¬å
æ¥çä¸ä¸ CGLIB 卿代ççç»æã
å¦ä¸å¾æç¤ºï¼ä»£ç类继æ¿äºç®æ ç±»ï¼æ¯æ¬¡è°ç¨ä»£çç±»çæ¹æ³é½ä¼å¨æ¦æªå¨ä¸è¿è¡æ¦æªï¼æ¦æªå¨ä¸åä¼è°ç¨ç®æ ç±»çæ¹æ³ã
ä¸é¢æä»¬éè¿ä¸ä¸ªç¤ºä¾æ¥æ¼ç¤ºä¸ä¸ CGLIB 卿代çç使ç¨
é¦å
导å
¥ CGLIB ç¸å
³ jar å
ï¼æä»¬ä½¿ç¨çæ¯ MAVEN çæ¹å¼
```xml
```java
public class UserDaoImpl implements UserDao {
public void saveUser() {
System.out.println("---- æå
¥ç¨æ· ----");
}
public UserDaoImpl() {
}
}
```
å¯ä»¥å¯¹æ¯ä¸ä¸ä¸é¢åç° UserDaoImpl åç°ç¼è¯å¨é¤äºä¸ºæä»¬æ·»å äºä¸ä¸ªå
¬æçæé å¨ï¼å
¶ä»åºæ¬ä¸è´ã
ç»è¿è¿ä¸ªç®åç示ä¾åï¼cxuan ç»ä½ æ¼ç¤ºä¸ä¸å¦ä½ä½¿ç¨ Javaassist 卿代çã
é¦å
æä»¬å
å建ä¸ä¸ª Javaassist ç代çå·¥åï¼ä»£ç å¦ä¸
```java
public class JavaassistProxyFactory {
public Object getProxy(Class clazz) throws Exception{
// 代çå·¥å
ProxyFactory proxyFactory = new ProxyFactory();
// 设置éè¦å建çåç±»
proxyFactory.setSuperclass(clazz);
proxyFactory.setHandler((self, thisMethod, proceed, args) -> {
System.out.println("---- å¼å§æ¦æª ----");
Object result = proceed.invoke(self, args);
System.out.println("---- ç»ææ¦æª ----");
return result;
});
return proxyFactory.createClass().newInstance();
}
}
```
ä¸é¢æä»¬å®ä¹äºä¸ä¸ªä»£çå·¥åï¼ä»£çå·¥åéé¢å建äºä¸ä¸ª handlerï¼å¨è°ç¨ç®æ æ¹æ³æ¶ï¼Javassist ä¼åè° MethodHandler æ¥å£æ¹æ³æ¦æªï¼æ¥è°ç¨çæ£æ§è¡çæ¹æ³ï¼ä½ å¯ä»¥å¨æ¦æªæ¹æ³çååå®ç°èªå·±çä¸å¡é»è¾ãæåç **proxyFactory.createClass().newInstance()** å°±æ¯ä½¿ç¨åèç ææ¯æ¥åå»ºäºæç»çåç±»å®ä¾ï¼è¿ç§ä»£çæ¹å¼ç±»ä¼¼äº JDK ä¸ç InvocationHandler æ¥å£ã
æµè¯æ¹æ³å¦ä¸
```java
public static void main(String[] args) throws Exception {
JavaassistProxyFactory proxyFactory = new JavaassistProxyFactory();
UserService userProxy = (UserService) proxyFactory.getProxy(UserService.class);
userProxy.saveUser();
}
```
### ASM 代ç
ASM æ¯ä¸å¥ Java åèç çææ¶æï¼å®å¯ä»¥å¨æçæäºè¿å¶æ ¼å¼çåç±»æå
¶å®ä»£çç±»ï¼æè
å¨ç±»è¢« Java èææºè£
å
¥å
åä¹åï¼å¨æä¿®æ¹ç±»ã
ä¸é¢æä»¬ä½¿ç¨ ASM æ¡æ¶å®ç°ä¸ä¸ªå¨æä»£çï¼ASM çæç卿代ç
以ä¸ä»£ç æèª https://blog.csdn.net/lightj1996/article/details/107305662
```java
public class AsmProxy extends ClassLoader implements Opcodes {
public static void createAsmProxy() throws Exception {
// ç®æ 类类å åèç ä¸ç±»ä¿®é¥°ç¬¦ä»¥ â/â åå²
String targetServiceName = TargetService.class.getName().replace(".", "/");
// åé¢ç±»ç±»å
String aspectServiceName = AspectService.class.getName().replace(".", "/");
// 代ç类类å
String proxyServiceName = targetServiceName+"Proxy";
// å建ä¸ä¸ª classWriter 宿¯ç»§æ¿äºClassVisitor
ClassWriter classWriter = new ClassWriter(0);
// 访é®ç±» æå®jdkçæ¬å·ä¸º1.8, 修饰符为 publicï¼ç¶ç±»æ¯TargetService
classWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, proxyServiceName, null, targetServiceName, null);
// 访é®ç®æ ç±»æååé 为类添å åé¢å±æ§ âprivate TargetService targetServiceâ
classWriter.visitField(ACC_PRIVATE, "targetService", "L" + targetServiceName+";", null, null);
// 访é®åé¢ç±»æååé 为类添å ç®æ 屿§ âprivate AspectService aspectServiceâ
classWriter.visitField(ACC_PRIVATE, "aspectService", "L" + aspectServiceName+";", null, null);
// 访é®é»è®¤æé æ¹æ³ TargetServiceProxy()
// å®ä¹å½æ° 修饰符为public æ¹æ³å为
> è³æ¤ï¼æä»¬å·²ç»ä»ç»äºåç§å¨æä»£ççæ¹å¼ï¼å嫿¯**JDK 卿代çãCGLIB 卿代çãJavaassist 卿代çãASM 卿代ç**ï¼é£ä¹ç°å¨æèä¸ä¸ªé®é¢ï¼ä¸ºä»ä¹ä¼æå¨æä»£ççåºç°å¢ï¼æè
è¯´å¨æä»£çæ¯åºäºä»ä¹åçå¢ï¼
å
¶å®æä»¬ä¸é¢å·²ç»æå°è¿äºï¼æ²¡éï¼å¨æä»£ç使ç¨çå°±æ¯`åå°` æºå¶ï¼åå°æºå¶æ¯ Java è¯è¨æä¾çä¸ç§åºç¡åè½ï¼ô±¥ô±©èµäºç¨åºå¨è¿è¡æ¶å¨æä¿®æ¹å±æ§ãæ¹æ³çè½åãéè¿å尿们è½å¤ç´æ¥æä½ç±»æè
å¯¹è±¡ï¼æ¯å¦è·åæä¸ªç±»çå®ä¹ï¼è·åæä¸ªç±»ç屿§å æ¹æ³çã
å
³äº Java åå°çç¸å
³å
容å¯ä»¥åè Java建设è
çè¿ä¸ç¯æç«
[精讲 Java åå°](https://github.com/crisxuan/bestJavaer/blob/master/java-basic/java-reflect.md)
å¦å¤è¿æéè¦æ³¨æçä¸ç¹ï¼ä»æ§è½è§åº¦æ¥è®²ï¼æäºäººå¾åºç»è®ºè¯´æ¯ Java 卿代çè¦æ¯ CGLIB å Javaassist æ
¢å ååï¼å
¶å®ï¼å¨ä¸»æµ JDK çæ¬ä¸ï¼Java 卿代çå¯ä»¥æä¾ç¸ççæ§è½æ°´å¹³ï¼**æ°é级çå·®è·ä¸æ¯å¹¿æ³åå¨ç**ãèä¸ï¼å¨ç°ä»£ JDK ä¸ï¼åå°å·²ç»å¾å°äºæ¹è¿åä¼åã
æä»¬å¨éåä¸ï¼æ§è½èé并䏿¯ä¸»è¦å
³æ³¨ç¹ï¼**å¯é æ§ãå¯ç»´æ¤æ§ãç¼ç å·¥ä½é**åçéè¦ã