---
title: Java åå°æºå¶è¯¦è§£
category: Java
tag:
- Javaåºç¡
---
## ä½ä¸ºåå°ï¼
å¦æè¯´å¤§å®¶ç ç©¶è¿æ¡æ¶çåºå±åçæè
å±ä»¬èªå·±åè¿æ¡æ¶çè¯ï¼ä¸å®å¯¹åå°è¿ä¸ªæ¦å¿µä¸éçã
åå°ä¹æä»¥è¢«ç§°ä¸ºæ¡æ¶ççµéï¼ä¸»è¦æ¯å 为å®èµäºäºæä»¬å¨è¿è¡æ¶åæç±»ä»¥åæ§è¡ç±»ä¸æ¹æ³çè½åã
éè¿åå°ä½ å¯ä»¥è·åä»»æä¸ä¸ªç±»çææå±æ§åæ¹æ³ï¼ä½ è¿å¯ä»¥è°ç¨è¿äºæ¹æ³å屿§ã
## åå°çåºç¨åºæ¯äºè§£ä¹ï¼
åå±ä»¬å¹³æ¶å¤§é¨åæ¶å齿¯å¨åä¸å¡ä»£ç ï¼å¾å°ä¼æ¥è§¦å°ç´æ¥ä½¿ç¨åå°æºå¶çåºæ¯ã
使¯ï¼è¿å¹¶ä¸ä»£è¡¨åå°æ²¡æç¨ãç¸åï¼æ£æ¯å 为åå°ï¼ä½ æè½è¿ä¹è½»æ¾å°ä½¿ç¨åç§æ¡æ¶ãå Spring/Spring BootãMyBatis ççæ¡æ¶ä¸é½å¤§é使ç¨äºåå°æºå¶ã
**è¿äºæ¡æ¶ä¸ä¹å¤§é使ç¨äºå¨æä»£çï¼è卿代ççå®ç°ä¹ä¾èµåå°ã**
æ¯å¦ä¸é¢æ¯éè¿ JDK å®ç°å¨æä»£çç示ä¾ä»£ç ï¼å
¶ä¸å°±ä½¿ç¨äºåå°ç±» `Method` æ¥è°ç¨æå®çæ¹æ³ã
```java
public class DebugInvocationHandler implements InvocationHandler {
/**
* 代çç±»ä¸ççå®å¯¹è±¡
*/
private final Object target;
public DebugInvocationHandler(Object target) {
this.target = target;
}
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;
}
}
```
å¦å¤ï¼å Java ä¸çä¸å¤§å©å¨ **注解** çå®ç°ä¹ç¨å°äºåå°ã
为ä»ä¹ä½ ä½¿ç¨ Spring çæ¶å ï¼ä¸ä¸ª`@Component`注解就声æäºä¸ä¸ªç±»ä¸º Spring Bean å¢ï¼ä¸ºä»ä¹ä½ éè¿ä¸ä¸ª `@Value`注解就读åå°é
ç½®æä»¶ä¸çå¼å¢ï¼ç©¶ç«æ¯æä¹èµ·ä½ç¨çå¢ï¼
è¿äºé½æ¯å ä¸ºä½ å¯ä»¥åºäºåå°åæç±»ï¼ç¶åè·åå°ç±»/屿§/æ¹æ³/æ¹æ³çåæ°ä¸ç注解ãä½ è·åå°æ³¨è§£ä¹åï¼å°±å¯ä»¥åè¿ä¸æ¥çå¤çã
## è°è°åå°æºå¶çä¼ç¼ºç¹
**ä¼ç¹**ï¼å¯ä»¥è®©å±ä»¬çä»£ç æ´å çµæ´»ã为åç§æ¡æ¶æä¾å¼ç®±å³ç¨çåè½æä¾äºä¾¿å©
**缺ç¹**ï¼è®©æä»¬å¨è¿è¡æ¶æäºåææä½ç±»çè½åï¼è¿åæ ·ä¹å¢å äºå®å
¨é®é¢ãæ¯å¦å¯ä»¥æ è§æ³ååæ°çå®å
¨æ£æ¥ï¼æ³ååæ°çå®å
¨æ£æ¥åçå¨ç¼è¯æ¶ï¼ãå¦å¤ï¼åå°çæ§è½ä¹è¦ç¨å·®ç¹ï¼ä¸è¿ï¼å¯¹äºæ¡æ¶æ¥è¯´å®é
æ¯å½±åä¸å¤§çãç¸å
³é
读ï¼[Java Reflection: Why is it so slow?](https://stackoverflow.com/questions/1392351/java-reflection-why-is-it-so-slow)
## åå°å®æ
### è·å Class 对象çåç§æ¹å¼
妿æä»¬å¨æè·åå°è¿äºä¿¡æ¯ï¼æä»¬éè¦ä¾é Class 对象ãClass 类对象å°ä¸ä¸ªç±»çæ¹æ³ãåéçä¿¡æ¯åè¯è¿è¡çç¨åºãJava æä¾äºåç§æ¹å¼è·å Class 对象:
**1. ç¥éå
·ä½ç±»çæ
åµä¸å¯ä»¥ä½¿ç¨ï¼**
```java
Class alunbarClass = TargetObject.class;
```
使¯æä»¬ä¸è¬æ¯ä¸ç¥éå
·ä½ç±»çï¼åºæ¬é½æ¯éè¿éåå
ä¸é¢çç±»æ¥è·å Class 对象ï¼éè¿æ¤æ¹å¼è·å Class 对象ä¸ä¼è¿è¡åå§å
**2. éè¿ `Class.forName()`ä¼ å
¥ç±»çå
¨è·¯å¾è·åï¼**
```java
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
```
**3. éè¿å¯¹è±¡å®ä¾`instance.getClass()`è·åï¼**
```java
TargetObject o = new TargetObject();
Class alunbarClass2 = o.getClass();
```
**4. éè¿ç±»å è½½å¨`xxxClassLoader.loadClass()`ä¼ å
¥ç±»è·¯å¾è·å:**
```java
ClassLoader.getSystemClassLoader().loadClass("cn.javaguide.TargetObject");
```
éè¿ç±»å è½½å¨è·å Class 对象ä¸ä¼è¿è¡åå§åï¼æå³çä¸è¿è¡å
æ¬åå§åçä¸ç³»åæ¥éª¤ï¼éæä»£ç ååéæå¯¹è±¡ä¸ä¼å¾å°æ§è¡
### åå°çä¸äºåºæ¬æä½
1. å建ä¸ä¸ªæä»¬è¦ä½¿ç¨åå°æä½çç±» `TargetObject`ã
```java
package cn.javaguide;
public class TargetObject {
private String value;
public TargetObject() {
value = "JavaGuide";
}
public void publicMethod(String s) {
System.out.println("I love " + s);
}
private void privateMethod() {
System.out.println("value is " + value);
}
}
```
2. 使ç¨åå°æä½è¿ä¸ªç±»çæ¹æ³ä»¥å屿§
```java
package cn.javaguide;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
/**
* è·å TargetObject ç±»ç Class 对象并ä¸å建 TargetObject ç±»å®ä¾
*/
Class> targetClass = Class.forName("cn.javaguide.TargetObject");
TargetObject targetObject = (TargetObject) targetClass.newInstance();
/**
* è·å TargetObject ç±»ä¸å®ä¹çæææ¹æ³
*/
Method[] methods = targetClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
/**
* è·åæå®æ¹æ³å¹¶è°ç¨
*/
Method publicMethod = targetClass.getDeclaredMethod("publicMethod",
String.class);
publicMethod.invoke(targetObject, "JavaGuide");
/**
* è·åæå®åæ°å¹¶å¯¹åæ°è¿è¡ä¿®æ¹
*/
Field field = targetClass.getDeclaredField("value");
//为äºå¯¹ç±»ä¸çåæ°è¿è¡ä¿®æ¹æä»¬åæ¶å®å
¨æ£æ¥
field.setAccessible(true);
field.set(targetObject, "JavaGuide");
/**
* è°ç¨ private æ¹æ³
*/
Method privateMethod = targetClass.getDeclaredMethod("privateMethod");
//为äºè°ç¨privateæ¹æ³æä»¬åæ¶å®å
¨æ£æ¥
privateMethod.setAccessible(true);
privateMethod.invoke(targetObject);
}
}
```
è¾åºå
容ï¼
```plain
publicMethod
privateMethod
I love JavaGuide
value is JavaGuide
```
**注æ** : æè¯»è
æå°ä¸é¢ä»£ç è¿è¡ä¼æåº `ClassNotFoundException` å¼å¸¸ï¼å
·ä½åå æ¯ä½ 没æä¸é¢æè¿æ®µä»£ç çå
åæ¿æ¢æèªå·±å建ç `TargetObject` æå¨çå
ã
å¯ä»¥åèï¼