# Javaåºç¡ åå°ç¯
åå°æ¯ä¸ä¸ªé常éè¦çç¥è¯ç¹ï¼å¨å¦ä¹ `Spring æ¡æ¶`æ¶ï¼Beançåå§åç¨å°äºåå°ï¼å¨``ç ´åå便¨¡å¼``æ¶ä¹ç¨å°äºåå°ï¼å¨`è·åæ æ³¨ç注解`æ¶ä¹ä¼ç¨å°åå°Â·Â·Â·Â·Â·Â·
å½ç¶äºï¼åå°å¨æ¥å¸¸å¼åä¸ï¼æä»¬æ²¡ç¢°å°è¿å¤å°ï¼è³å°ææ²¡æä¹ç¨è¿ãä½é¢è¯æ¯**é ç«ç®**ç°åºï¼å¯ç±çé¢è¯å®ä»¬åæä¼è½»æå°æ¾è¿æä»¬å¢ï¼åå°æ¯å¼æºæ¡æ¶ä¸çä¸ä¸ªéè¦è®¾è®¡ç念ï¼å¨æºç åæä¸å°ä¸äºå®çèº«å½±ï¼æä»¥ï¼ä»å¤©æä¼å°½éç¨æµ
æ¾ææçè¯è¨ï¼è®©ä½ å»çè§£ä¸é¢è¿å ç¹ï¼
ï¼1ï¼åå°çææ³ä»¥åå®çä½ç¨â :point_right: **æ¦å¿µç¯**
ï¼2ï¼åå°çåºæ¬ä½¿ç¨ååºç¨åºæ¯ :point_right: **åºç¨ç¯**
ï¼3ï¼ä½¿ç¨åå°è½ç»æä»¬ç¼ç æ¶å¸¦æ¥çä¼å¿ä»¥ååå¨çç¼ºé· :point_right: **åæç¯**
## åå°çææ³åä½ç¨
æåå¿
ææ£ï¼å°±åä¸é´çé´åé³ï¼è®¡ç®æºç0å1䏿 ·ã天éæè½®åï¼è天...~~ï¼åä¼å¨è¿çbibiï¼~~
å¨å¦ä¹ åå°ä¹åï¼å
æ¥äºè§£**æ£å°**æ¯ä»ä¹ãæä»¬å¹³å¸¸ç¨çæå¤ç `new` æ¹å¼å®ä¾åå¯¹è±¡çæ¹å¼å°±æ¯ä¸ç§æ£å°çä½ç°ãå妿éè¦å®ä¾åä¸ä¸ª`HashMap`ï¼ä»£ç 就伿¯è¿æ ·åã
```java
Map map = new HashMap<>();
map.put(1, 1);
```
æä¸å¤©åç°ï¼è¯¥æ®µç¨åºä¸éåç¨ HashMap åå¨é®å¼å¯¹ï¼æ´å¾åäºç¨`LinkedHashMap`åå¨ãéæ°ç¼å代ç ååæä¸é¢è¿ä¸ªæ ·åã
```java
Map map = new LinkedHashMap<>();
map.put(1, 1);
```
åå¦åæä¸å¤©ï¼åç°æ°æ®è¿æ¯éåç¨ HashMapæ¥åå¨ï¼é¾éåè¦éæ°ä¿®æ¹æºç åï¼
> åç°é®é¢äºåï¼æä»¬æ¯æ¬¡æ¹åä¸ç§éæ±ï¼é½è¦å»éæ°**ä¿®æ¹æºç **ï¼ç¶å对代ç è¿è¡ç¼è¯ï¼æå
ï¼åå° JVM ä¸éå¯é¡¹ç®ãè¿ä¹äºæ¥éª¤ä¸æ¥ï¼æçé常ä½ã

对äºè¿ç§**éæ±é¢ç¹åæ´ä½åæ´ä¸å¤§**çåºæ¯ï¼é¢ç¹å°æ´æ¹æºç è¯å®æ¯ä¸ç§ä¸å
许çæä½ï¼æä»¬å¯ä»¥ä½¿ç¨ä¸ä¸ª`å¼å
³`ï¼å¤æä»ä¹æ¶å使ç¨åªä¸ç§æ°æ®ç»æã
```java
public Map getMap(String param) {
Map map = null;
if (param.equals("HashMap")) {
map = new HashMap<>();
} else if (param.equals("LinkedHashMap")) {
map = new LinkedHashMap<>();
} else if (param.equals("WeakHashMap")) {
map = new WeakHashMap<>();
}
return map;
}
```
éè¿ä¼ å
¥åæ°`param`å³å®ä½¿ç¨åªä¸ç§æ°æ®ç»æï¼å¯ä»¥å¨é¡¹ç®è¿è¡æ¶ï¼éè¿**å¨æä¼ å
¥åæ°**å³å®ä½¿ç¨åªä¸ä¸ªæ°æ®ç»æã
妿æä¸å¤©è¿æ³ç¨`TreeMap`ï¼è¿æ¯é¿å
ä¸äºä¿®æ¹æºç ï¼éæ°ç¼è¯æ§è¡çå¼ç«¯ãè¿ä¸ªæ¶åï¼**åå°**就派ä¸ç¨åºäºã
å¨ä»£ç è¿è¡ä¹åï¼æä»¬**ä¸ç¡®å®**å°æ¥ä¼ä½¿ç¨åªä¸ç§æ°æ®ç»æï¼åªæå¨ç¨åº**è¿è¡æ¶æå³å®**使ç¨åªä¸ä¸ªæ°æ®ç±»ï¼è`åå°`å¯ä»¥å¨**ç¨åºè¿è¡è¿ç¨**ä¸å¨æ**è·å类信æ¯**å**è°ç¨ç±»æ¹æ³**ãéè¿åå°æé ç±»å®ä¾ï¼ä»£ç 伿¼åæä¸é¢è¿æ ·ã
```java
public Map getMap(String className) {
Class clazz = Class.forName(className);
Consructor con = clazz.getConstructor();
return (Map) con.newInstance();
}
```
æ 论使ç¨ä»ä¹ Mapï¼åªè¦å®ç°äº`Mapæ¥å£`ï¼å°±å¯ä»¥ä½¿ç¨`å
¨ç±»åè·¯å¾`ä¼ å
¥å°æ¹æ³ä¸ï¼è·å¾å¯¹åºç Map å®ä¾ãä¾å¦java.util.HashMap / java.util.LinkedHashMapÂ·Â·Â·Â·å¦æè¦å建å
¶å®ç±»ä¾å¦`WeakHashMap`ï¼æä¹**ä¸éè¦ä¿®æ¹ä¸é¢è¿æ®µæºç **ã
æä»¬æ¥å顾ä¸ä¸å¦ä½ä» `new` ä¸ä¸ªå¯¹è±¡å¼åºä½¿ç¨`åå°`çã
- å¨ä¸ä½¿ç¨åå°æ¶ï¼æé å¯¹è±¡ä½¿ç¨ new æ¹å¼å®ç°ï¼è¿ç§æ¹å¼å¨**ç¼è¯æ**å°±å¯ä»¥æå¯¹è±¡çç±»åç¡®å®ä¸æ¥ã
- 妿鿱åçåæ´ï¼éè¦æé å¦ä¸ä¸ªå¯¹è±¡ï¼åéè¦ä¿®æ¹æºç ï¼é常ä¸ä¼é
ï¼æä»¥æä»¬éè¿ä½¿ç¨`å¼å
³`ï¼å¨ç¨åºè¿è¡æ¶å¤æéè¦æé åªä¸ä¸ªå¯¹è±¡ï¼å¨è¿è¡æ¶å¯ä»¥**åæ´å¼å
³**æ¥å®ä¾åä¸åçæ°æ®ç»æã
- å¦æè¿æå
¶å®æ©å±çç±»æå¯è½è¢«ä½¿ç¨ï¼å°±ä¼å建åº**é常å¤ç忝**ï¼ä¸å¨ç¼ç æ¶ä¸ç¥éæä»ä¹å
¶ä»ç类被使ç¨å°ï¼å妿¥å`Map`æ¥å£ä¸å¤äºä¸ä¸ªéåç±»æ¯`xxxHashMap`ï¼è¿å¾åå»ºåæ¯ï¼æ¤æ¶å¼åºäºåå°ï¼å¯ä»¥å¨`è¿è¡æ¶`æç¡®å®ä½¿ç¨åªä¸ä¸ªæ°æ®ç±»ï¼å¨åæ¢ç±»æ¶ï¼æ ééæ°ä¿®æ¹æºç ãç¼è¯ç¨åºã
第ä¸ç« æ»ç»ï¼
- åå°ç**ææ³**ï¼**å¨ç¨åºè¿è¡è¿ç¨ä¸ç¡®å®åè§£ææ°æ®ç±»çç±»åã**
- åå°ç**ä½ç¨**ï¼å¯¹äºå¨`ç¼è¯æ`æ æ³ç¡®å®ä½¿ç¨åªä¸ªæ°æ®ç±»çåºæ¯ï¼éè¿`åå°`å¯ä»¥å¨ç¨åºè¿è¡æ¶**æé åºä¸åçæ°æ®ç±»å®ä¾**ã
## åå°çåºæ¬ä½¿ç¨
Java åå°ç主è¦ç»æé¨åæ4个ï¼
- `Class`ï¼ä»»ä½è¿è¡å¨å
åä¸çææç±»é½æ¯è¯¥ Class ç±»çå®ä¾å¯¹è±¡ï¼æ¯ä¸ª Class 类对象å
é¨é½å
å«äºæ¬æ¥ç**ææä¿¡æ¯**ãè®°çä¸å¥è¯ï¼éè¿åå°å¹²ä»»ä½äºï¼å
æ¾ Class åæ²¡éï¼
- `Field`ï¼æè¿°ä¸ä¸ªç±»ç**屿§**ï¼å
é¨å
å«äºè¯¥å±æ§çææä¿¡æ¯ï¼ä¾å¦**æ°æ®ç±»åï¼å±æ§åï¼è®¿é®ä¿®é¥°ç¬¦**······
- `Constructor`ï¼æè¿°ä¸ä¸ªç±»ç**æé æ¹æ³**ï¼å
é¨å
å«äºæé æ¹æ³çææä¿¡æ¯ï¼ä¾å¦**åæ°ç±»åï¼åæ°ååï¼è®¿é®ä¿®é¥°ç¬¦**······
- `Method`ï¼æè¿°ä¸ä¸ªç±»ç**æææ¹æ³**ï¼å
æ¬æ½è±¡æ¹æ³ï¼ï¼å
é¨å
å«äºè¯¥æ¹æ³çææä¿¡æ¯ï¼ä¸`Constructor`类似ï¼ä¸åä¹å¤æ¯ Method æ¥æ**è¿åå¼ç±»å**ä¿¡æ¯ï¼å 为æé æ¹æ³æ¯æ²¡æè¿åå¼çã
ææ»ç»äºä¸å¼ èå¾ï¼æ¾å¨äºä¸é¢ï¼å¦æç¨å°äºåå°ï¼ç¦»ä¸å¼è¿æ ¸å¿ç`4`个类ï¼åªæå»äºè§£å®ä»¬å
鍿ä¾äºåªäºä¿¡æ¯ï¼æä»ä¹ä½ç¨ï¼è¿ç¨å®ä»¬çæ¶åæè½**æå¦åæ**ã

æä»¬å¨å¦ä¹ åå°çåºæ¬ä½¿ç¨æ¶ï¼æä¼ç¨ä¸ä¸ª`SmallPineapple`ç±»ä½ä¸ºæ¨¡æ¿è¿è¡è¯´æï¼é¦å
æä»¬å
æ¥çæè¿ä¸ªç±»çåºæ¬ç»æï¼**屿§ï¼æé 彿°åæ¹æ³**
```java
public class SmallPineapple {
public String name;
public int age;
private double weight; // ä½éåªæèªå·±ç¥é
public SmallPineapple() {}
public SmallPineapple(String name, int age) {
this.name = name;
this.age = age;
}
public void getInfo() {
System.out.print("["+ name + " ç年龿¯ï¼" + age + "]");
}
}
```
åå°ä¸çç¨æ³æé常é常å¤ï¼å¸¸è§çåè½æä»¥ä¸è¿å 个ï¼
- å¨è¿è¡æ¶è·åä¸ä¸ªç±»ç **Class 对象**
- å¨è¿è¡æ¶æé ä¸ä¸ªç±»ç**å®ä¾å对象**
- å¨è¿è¡æ¶è·åä¸ä¸ªç±»çææä¿¡æ¯ï¼**åéãæ¹æ³ãæé å¨ã注解**
### è·åç±»ç Class 对象
å¨ Java ä¸ï¼æ¯ä¸ä¸ªç±»é½ä¼æä¸å±äºèªå·±ç Class 对象ï¼å½æä»¬ç¼åå®`.java`æä»¶åï¼ä½¿ç¨`javac`ç¼è¯åï¼å°±ä¼äº§çä¸ä¸ªåèç æä»¶`.class`ï¼å¨åèç æä»¶ä¸å
å«ç±»çææä¿¡æ¯ï¼å¦`屿§`ï¼`æé æ¹æ³`ï¼`æ¹æ³`······å½åèç æä»¶è¢«è£
è½½è¿èææºæ§è¡æ¶ï¼ä¼å¨å
åä¸çæ Class 对象ï¼å®å
å«äºè¯¥ç±»å
é¨çææä¿¡æ¯ï¼å¨ç¨åºè¿è¡æ¶å¯ä»¥è·åè¿äºä¿¡æ¯ã
è·å Class å¯¹è±¡çæ¹æ³æ`3`ç§ï¼
- `ç±»å.class`ï¼è¿ç§è·åæ¹å¼åªæå¨`ç¼è¯`åå·²ç»å£°æäºè¯¥ç±»çç±»åæè½è·åå° Class 对象
```java
Class clazz = SmallPineapple.class;
```
- `å®ä¾.getClass()`ï¼éè¿å®ä¾å对象è·å该å®ä¾ç Class 对象
```java
SmallPineapple sp = new SmallPineapple();
Class clazz = sp.getClass();
```
- `Class.forName(className)`ï¼éè¿ç±»ç**å
¨éå®å**è·å该类ç Class 对象
```java
Class clazz = Class.forName("com.bean.smallpineapple");
```
æ¿å° `Class`对象就å¯ä»¥å¯¹å®ä¸ºææ¬²ä¸ºäºï¼å¥å¼å®çç®ï¼è·å**类信æ¯**ï¼ãææ¥å®åäºï¼è°ç¨å®ç**æ¹æ³**ï¼ï¼çéå®çä¸åï¼è·å**屿§**ï¼ï¼æ»ä¹å®å°±æ²¡æéç§äºã
ä¸è¿å¨ç¨åºä¸ï¼æ¯ä¸ªç±»ç Class å¯¹è±¡åªæä¸ä¸ªï¼ä¹å°±æ¯è¯´ä½ åªæè¿ä¸ä¸ª`奴é¶`ãæä»¬ç¨ä¸é¢ä¸ç§æ¹å¼æµè¯ï¼éè¿ä¸ç§æ¹å¼æå°å个 `Class` å¯¹è±¡é½æ¯ç¸åçã
```java
Class clazz1 = Class.forName("com.bean.SmallPineapple");
Class clazz2 = SmallPineapple.class;
SmallPineapple instance = new SmallPineapple();
Class clazz3 = instance.getClass();
System.out.println("Class.forName() == SmallPineapple.class:" + (clazz1 == clazz2));
System.out.println("Class.forName() == instance.getClass():" + (clazz1 == clazz3));
System.out.println("instance.getClass() == SmallPineapple.class:" + (clazz2 == clazz3));
```

> å
åä¸åªæä¸ä¸ª Class 对象çåå è¦çµæ¯å° `JVM ç±»å è½½æºå¶`ç`åäº²å§æ´¾æ¨¡å`ï¼å®ä¿è¯äºç¨åºè¿è¡æ¶ï¼`å 载类`æ¶æ¯ä¸ªç±»å¨å
åä¸ä»
ä¼äº§çä¸ä¸ª`Class对象`ãå¨è¿éæä¸æç®è¯¦ç»å±å¼è¯´æï¼å¯ä»¥ç®åå°ç解为 JVM 帮æä»¬ä¿è¯äº**ä¸ä¸ªç±»å¨å
åä¸è³å¤åå¨ä¸ä¸ª Class 对象**ã
### æé ç±»çå®ä¾å对象
éè¿åå°æé ä¸ä¸ªç±»çå®ä¾æ¹å¼æ`2`ç§ï¼
- Class 对象è°ç¨`newInstance()`æ¹æ³
```java
Class clazz = Class.forName("com.bean.SmallPineapple");
SmallPineapple smallPineapple = (SmallPineapple) clazz.newInstance();
smallPineapple.getInfo();
// [null ç年龿¯ï¼0]
```
å³ä½¿ SmallPineapple å·²ç»æ¾å¼å®ä¹äºæé æ¹æ³ï¼éè¿ newInstance() å建çå®ä¾ä¸ï¼ææå±æ§å¼é½æ¯å¯¹åºç±»åç`åå§å¼`ï¼å 为 newInstance() æé å®ä¾ä¼**è°ç¨é»è®¤æ åæé å¨**ã
- Constructor æé å¨è°ç¨`newInstance()`æ¹æ³
```java
Class clazz = Class.forName("com.bean.SmallPineapple");
Constructor constructor = clazz.getConstructor(String.class, int.class);
constructor.setAccessible(true);
SmallPineapple smallPineapple2 = (SmallPineapple) constructor.newInstance("å°è è", 21);
smallPineapple2.getInfo();
// [å°è è ç年龿¯ï¼21]
```
éè¿ getConstructor(Object... paramTypes) æ¹æ³æå®è·å**æå®åæ°ç±»å**ç Constructorï¼ Constructor è°ç¨ newInstance(Object... paramValues) æ¶ä¼ å
¥æé æ¹æ³åæ°çå¼ï¼åæ ·å¯ä»¥æé ä¸ä¸ªå®ä¾ï¼ä¸å
é¨å±æ§å·²ç»è¢«èµå¼ã
éè¿`Class`对象è°ç¨ newInstance() ä¼èµ°**é»è®¤æ åæé æ¹æ³**ï¼å¦ææ³éè¿**æ¾å¼æé æ¹æ³**æé å®ä¾ï¼éè¦æåä»Classä¸è°ç¨`getConstructor()`æ¹æ³è·å对åºçæé å¨ï¼éè¿æé å¨å»å®ä¾å对象ã
> è¿äº API æ¯å¨å¼åå½ä¸æå¸¸éå°çï¼å½ç¶è¿æé常å¤éè½½çæ¹æ³ï¼æ¬æç±äºç¯å¹
åå ï¼ä¸å¦ææ¯ä¸ªæ¹æ³é½ä¸ä¸è®²è§£ï¼æä»¬ä¹è®°ä¸ä½ï¼æä»¥ç¨å°çæ¶åå»ç±»é颿¥æ¾å°±å·²ç»è¶³å¤äºã
### è·åä¸ä¸ªç±»çææä¿¡æ¯
**Class 对象ä¸å
å«äºè¯¥ç±»çææä¿¡æ¯ï¼å¨ç¼è¯ææä»¬è½çå°çä¿¡æ¯å°±æ¯è¯¥ç±»çåéãæ¹æ³ãæé å¨ï¼å¨è¿è¡æ¶æå¸¸è¢«è·åç乿¯è¿äºä¿¡æ¯ã**

### è·åç±»ä¸çåéï¼Fieldï¼
- Field[] getFields()ï¼è·åç±»ä¸ææè¢«`public`ä¿®é¥°çææåé
- Field getField(String name)ï¼æ ¹æ®**åéå**è·åç±»ä¸çä¸ä¸ªåéï¼è¯¥**åéå¿
须被public修饰**
- Field[] getDeclaredFields()ï¼è·åç±»ä¸ææçåéï¼ä½**æ æ³è·åç»§æ¿ä¸æ¥çåé**
- Field getDeclaredField(String name)ï¼æ ¹æ®å§åè·åç±»ä¸çæä¸ªåéï¼**æ æ³è·åç»§æ¿ä¸æ¥çåé**
### è·åç±»ä¸çæ¹æ³ï¼Methodï¼
- Method[] getMethods()ï¼è·åç±»ä¸è¢«`public`ä¿®é¥°çæææ¹æ³
- Method getMethod(String name, Class...> paramTypes)ï¼æ ¹æ®**ååååæ°ç±»å**è·åå¯¹åºæ¹æ³ï¼è¯¥æ¹æ³å¿
须被`public`修饰
- Method[] getDeclaredMethods()ï¼è·å`ææ`æ¹æ³ï¼ä½**æ æ³è·åç»§æ¿ä¸æ¥çæ¹æ³**
- Method getDeclaredMethod(String name, Class...> paramTypes)ï¼æ ¹æ®**ååååæ°ç±»å**è·åå¯¹åºæ¹æ³ï¼**æ æ³è·åç»§æ¿ä¸æ¥çæ¹æ³**
### è·åç±»çæé å¨ï¼Constructorï¼
- Constuctor[] getConstructors()ï¼è·åç±»ä¸ææè¢«`public`修饰çæé å¨
- Constructor getConstructor(Class...> paramTypes)ï¼æ ¹æ®`åæ°ç±»å`è·åç±»ä¸æä¸ªæé å¨ï¼è¯¥æé å¨å¿
须被`public`修饰
- Constructor[] getDeclaredConstructors()ï¼è·åç±»ä¸æææé å¨
- Constructor getDeclaredConstructor(class...> paramTypes)ï¼æ ¹æ®`åæ°ç±»å`è·å对åºçæé å¨
æ¯ç§åè½å
é¨ä»¥ Declared ç»å为`2`ç±»ï¼
> æ`Declared`ä¿®é¥°çæ¹æ³ï¼å¯ä»¥è·å该类å
é¨å
å«ç**ææ**åéãæ¹æ³åæé å¨ï¼ä½æ¯**æ æ³è·åç»§æ¿ä¸æ¥çä¿¡æ¯**
>
> æ `Declared`ä¿®é¥°çæ¹æ³ï¼å¯ä»¥è·å该类ä¸`public`修饰çåéãæ¹æ³åæé å¨ï¼å¯**è·åç»§æ¿ä¸æ¥çä¿¡æ¯**
妿æ³è·åç±»ä¸**ææçï¼å
æ¬ç»§æ¿ï¼**åéãæ¹æ³åæé å¨ï¼åéè¦åæ¶è°ç¨`getXXXs()`å`getDeclaredXXXs()`ä¸¤ä¸ªæ¹æ³ï¼ç¨`Set`éååå¨å®ä»¬è·å¾çåéãæé å¨åæ¹æ³ï¼ä»¥é²ä¸¤ä¸ªæ¹æ³è·åå°ç¸åçä¸è¥¿ã
ä¾å¦ï¼è¦è·åSmallPineappleè·åç±»ä¸**ææçåé**ï¼ä»£ç åºè¯¥æ¯ä¸é¢è¿æ ·åã
```java
Class clazz = Class.forName("com.bean.SmallPineapple");
// è·å public 屿§ï¼å
æ¬ç»§æ¿
Field[] fields1 = clazz.getFields();
// è·åææå±æ§ï¼ä¸å
æ¬ç»§æ¿
Field[] fields2 = clazz.getDeclaredFields();
// å°ææå±æ§æ±æ»å° set
Set allFields = new HashSet<>();
allFields.addAll(Arrays.asList(fields1));
allFields.addAll(Arrays.asList(fields2));
```
> ä¸ç¥éä½ ææ²¡æåç°ä¸ä»¶**æè¶£çäºæ
**ï¼å¦æç¶ç±»ç屿§ç¨`protected`修饰ï¼å©ç¨åå°æ¯**æ æ³è·åå°**çã
>
> protected 修饰符çä½ç¨èå´ï¼åªå
许`åä¸ä¸ªå
ä¸`æè
`åç±»`访é®ï¼å¯ä»¥ç»§æ¿å°åç±»ã
>
> getFields() åªè½è·åå°æ¬ç±»ç`public`屿§çåéå¼ï¼
>
> getDeclaredFields() åªè½è·åå°**æ¬ç±»çææå±æ§ï¼ä¸å
æ¬ç»§æ¿**çï¼æ 论å¦ä½é½è·åä¸å°ç¶ç±»ç protected 屿§ä¿®é¥°çåéï¼ä½æ¯å®çç确确åå¨äºåç±»ä¸ã
### è·å注解
**è·å注解åç¬æ§äºåºæ¥ï¼å 为å®å¹¶ä¸æ¯ä¸å±äº Class 对象çä¸ç§ä¿¡æ¯ï¼æ¯ä¸ªåéï¼æ¹æ³åæé å¨é½å¯ä»¥è¢«æ³¨è§£ä¿®é¥°ï¼æä»¥å¨åå°ä¸ï¼Fieldï¼Constructor å Method 类对象é½å¯ä»¥è°ç¨ä¸é¢è¿äºæ¹æ³è·åæ æ³¨å¨å®ä»¬ä¹ä¸ç注解ã**
- Annotation[] getAnnotations()ï¼è·å该对象ä¸ç**æææ³¨è§£**
- Annotation getAnnotation(Class annotaionClass)ï¼ä¼ å
¥`注解类å`ï¼è·å该对象ä¸çç¹å®ä¸ä¸ªæ³¨è§£
- Annotation[] getDeclaredAnnotations()ï¼è·å该对象ä¸çæ¾å¼æ æ³¨çæææ³¨è§£ï¼æ æ³è·å`ç»§æ¿`䏿¥ç注解
- Annotation getDeclaredAnnotation(Class annotationClass)ï¼æ ¹æ®`注解类å`ï¼è·å该对象ä¸çç¹å®ä¸ä¸ªæ³¨è§£ï¼æ æ³è·å`ç»§æ¿`䏿¥ç注解
åªææ³¨è§£ç`@Retension`æ æ³¨ä¸º`RUNTIME`æ¶ï¼æè½å¤éè¿åå°è·åå°è¯¥æ³¨è§£ï¼@Retension æ`3`ç§ä¿åçç¥ï¼
- `SOURCE`ï¼åªå¨**æºæä»¶(.java)**ä¸ä¿åï¼å³è¯¥æ³¨è§£åªä¼ä¿ç卿ºæä»¶ä¸ï¼**ç¼è¯æ¶ç¼è¯å¨ä¼å¿½ç¥è¯¥æ³¨è§£**ï¼ä¾å¦ @Override 注解
- `CLASS`ï¼ä¿åå¨**åèç æä»¶(.class)**ä¸ï¼æ³¨è§£ä¼éçç¼è¯è·éåèç æä»¶ä¸ï¼ä½æ¯**è¿è¡æ¶**ä¸ä¼å¯¹è¯¥æ³¨è§£è¿è¡è§£æ
- `RUNTIME`ï¼ä¸ç´ä¿åå°**è¿è¡æ¶**ï¼**ç¨å¾æå¤çä¸ç§ä¿åçç¥**ï¼å¨è¿è¡æ¶å¯ä»¥è·åå°è¯¥æ³¨è§£çææä¿¡æ¯
åä¸é¢è¿ä¸ªä¾åï¼SmallPineapple 类继æ¿äºæ½è±¡ç±»`Pineapple`ï¼`getInfo()`æ¹æ³ä¸æ è¯æ @Override 注解ï¼ä¸å¨åç±»ä¸æ 注äº`@Transient`注解ï¼å¨è¿è¡æ¶è·ååç±»éåæ¹æ³ä¸çæææ³¨è§£ï¼åªè½è·åå°`@Transient`çä¿¡æ¯ã
```java
public abstract class Pineapple {
public abstract void getInfo();
}
public class SmallPineapple extends Pineapple {
@Transient
@Override
public void getInfo() {
System.out.print("å°è èç身é«å年龿¯:" + height + "cm ; " + age + "å²");
}
}
```
å¯å¨ç±»`Bootstrap`è·å SmallPineapple ç±»ä¸ç getInfo() æ¹æ³ä¸ç注解信æ¯ï¼
```java
public class Bootstrap {
/**
* æ ¹æ®è¿è¡æ¶ä¼ å
¥çå
¨ç±»åè·¯å¾å¤æå
·ä½ç类对象
* @param path ç±»çå
¨ç±»åè·¯å¾
*/
public static void execute(String path) throws Exception {
Class obj = Class.forName(path);
Method method = obj.getMethod("getInfo");
Annotation[] annotations = method.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation.toString());
}
}
public static void main(String[] args) throws Exception {
execute("com.pineapple.SmallPineapple");
}
}
// @java.beans.Transient(value=true)
```
### éè¿åå°è°ç¨æ¹æ³
éè¿åå°è·åå°æä¸ª Method 类对象åï¼å¯ä»¥éè¿è°ç¨`invoke`æ¹æ³æ§è¡ã
- `invoke(Oject obj, Object... args)`ï¼åæ°``1`æå®è°ç¨è¯¥æ¹æ³ç**对象**ï¼åæ°`2`æ¯æ¹æ³çåæ°å表å¼ã
妿è°ç¨çæ¹æ³æ¯**éææ¹æ³**ï¼åæ°1åªéè¦ä¼ å
¥`null`ï¼å ä¸ºéææ¹æ³ä¸ä¸æä¸ªå¯¹è±¡æå
³ï¼åªä¸æä¸ªç±»æå
³ã
å¯ä»¥åä¸é¢è¿ç§åæ³ï¼éè¿åå°å®ä¾åä¸ä¸ªå¯¹è±¡ï¼ç¶åè·å`Method`æ¹æ³å¯¹è±¡ï¼è°ç¨`invoke()`æå®`SmallPineapple`ç`getInfo()`æ¹æ³ã
```java
Class clazz = Class.forName("com.bean.SmallPineapple");
Constructor constructor = clazz.getConstructor(String.class, int.class);
constructor.setAccessible(true);
SmallPineapple sp = (SmallPineapple) constructor.newInstance("å°è è", 21);
Method method = clazz.getMethod("getInfo");
if (method != null) {
method.invoke(sp, null);
}
// [å°è èç年龿¯ï¼21]
```
## åå°çåºç¨åºæ¯
åå°å¸¸è§çåºç¨åºæ¯è¿éä»ç»`3`个ï¼
- Spring å®ä¾å对象ï¼å½ç¨åºå¯å¨æ¶ï¼Spring ä¼è¯»åé
ç½®æä»¶`applicationContext.xml`å¹¶è§£æåºé颿æç æ ç¾å®ä¾åå°`IOC`容å¨ä¸ã
- åå° + 工忍¡å¼ï¼éè¿`åå°`æ¶é¤å·¥åä¸çå¤ä¸ªåæ¯ï¼å¦æéè¦ç产æ°çç±»ï¼æ éå
³æ³¨å·¥åç±»ï¼å·¥åç±»å¯ä»¥åºå¯¹åç§æ°å¢çç±»ï¼`åå°`å¯ä»¥ä½¿å¾ç¨åºæ´å å¥å£®ã
- JDBCè¿æ¥æ°æ®åºï¼ä½¿ç¨JDBCè¿æ¥æ°æ®åºæ¶ï¼æå®è¿æ¥æ°æ®åºç`驱å¨ç±»`æ¶ç¨å°åå°å 载驱å¨ç±»
### Spring ç IOC 容å¨
å¨ Spring ä¸ï¼ç»å¸¸ä¼ç¼åä¸ä¸ªä¸ä¸æé
ç½®æä»¶`applicationContext.xml`ï¼éé¢å°±æ¯å
³äº`bean`çé
ç½®ï¼ç¨åºå¯å¨æ¶ä¼è¯»å该 xml æä»¶ï¼è§£æåºææç ``æ ç¾ï¼å¹¶å®ä¾å对象æ¾å
¥`IOC`容å¨ä¸ã
```xml
```
å¨å®ä¹å¥½ä¸é¢çæä»¶åï¼éè¿`ClassPathXmlApplicationContext`å 载该é
ç½®æä»¶ï¼ç¨åºå¯å¨æ¶ï¼Spring ä¼å°è¯¥é
ç½®æä»¶ä¸çææ`bean`é½å®ä¾åï¼æ¾å
¥ IOC 容å¨ä¸ï¼IOC 容卿¬è´¨ä¸å°±æ¯ä¸ä¸ªå·¥åï¼éè¿è¯¥å·¥åä¼ å
¥ \ æ ç¾ç`id`屿§è·åå°å¯¹åºçå®ä¾ã
```java
public class Main {
public static void main(String[] args) {
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
SmallPineapple smallPineapple = (SmallPineapple) ac.getBean("smallpineapple");
smallPineapple.getInfo(); // [å°è èç年龿¯ï¼21]
}
}
```
Spring å¨å®ä¾å对象çè¿ç¨ç»è¿ç®åä¹åï¼å¯ä»¥ç解为åå°å®ä¾åå¯¹è±¡çæ¥éª¤ï¼
- **è·åClass对象çæé å¨**
- éè¿æé å¨**è°ç¨ newInstance()** å®ä¾å对象
å½ç¶ Spring å¨å®ä¾å对象æ¶ï¼åäºé常å¤é¢å¤çæä½ï¼æè½å¤è®©ç°å¨çå¼åè¶³å¤ç**便æ·ä¸ç¨³å®**ã
> å¨ä¹åçæç« ä¸ä¼ä¸é¨åä¸ç¯æç« 讲解å¦ä½å©ç¨åå°å®ç°ä¸ä¸ª`ç®æç`ç`IOC`容å¨ï¼IOC容å¨åçå¾ç®åï¼åªè¦ææ¡äºåå°çææ³ï¼äºè§£åå°çå¸¸ç¨ API å°±å¯ä»¥å®ç°ï¼æå¯ä»¥æä¾ä¸ä¸ªç®åçæè·¯ï¼å©ç¨ HashMap å卿æå®ä¾ï¼key 代表 \ æ ç¾ç `id`ï¼value åå¨å¯¹åºçå®ä¾ï¼è¿å¯¹åºäº Spring IOC容å¨ç®¡çç对象é»è®¤æ¯**åä¾**çã
### åå° + æ½è±¡å·¥å模å¼
ä¼ ç»ç工忍¡å¼ï¼å¦æéè¦ç产æ°çåç±»ï¼**éè¦ä¿®æ¹å·¥åç±»ï¼å¨å·¥åç±»ä¸å¢å æ°ç忝**ï¼
```java
public class MapFactory {
public Map