--- title: åå°æºå¶è¯¦è§£ 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 Class clazz = ClassLoader.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> tagetClass = Class.forName("cn.javaguide.TargetObject"); TargetObject targetObject = (TargetObject) tagetClass.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); } } ``` è¾åºå å®¹ï¼ ``` publicMethod privateMethod I love JavaGuide value is JavaGuide ``` **注æ** : æè¯»è æå°ä¸é¢ä»£ç è¿è¡ä¼æåº `ClassNotFoundException` å¼å¸¸,å ·ä½åå æ¯ä½ 没æä¸é¢æè¿æ®µä»£ç çå åæ¿æ¢æèªå·±å建ç `TargetObject` æå¨çå ã ```java Class> targetClass = Class.forName("cn.javaguide.TargetObject"); ```