@@ -548,6 +548,142 @@ Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上
548548
549549
550550
551+ ## 38.什么是反射机制?反射机制的应用场景有哪些?
552+
553+ ### 反射机制介绍
554+
555+ JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
556+
557+ ### 获取Class对象的两种方式
558+
559+ 如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java提供了两种方式获取Class对象:
560+
561+ 1.知道具体类的情况下可以使用:
562+
563+ ```java
564+ Class alunbarClass = TargetObject.class;
565+ ```
566+
567+ 但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象
568+
569+ 2.通过 `Class.forName ()`传入类的路径获取:
570+
571+ ```java
572+ Class alunbarClass1 = Class.forName ("cn.javaguide. TargetObject ");
573+ ```
574+
575+ ### 代码实例
576+
577+ ** 简单用代码演示一下反射的一些操作! **
578+
579+ 1. 创建一个我们要使用反射操作的类 `TargetObject `:
580+
581+ ```java
582+ package cn. javaguide;
583+
584+ public class TargetObject {
585+ private String value;
586+
587+ public TargetObject () {
588+ value = " JavaGuide" ;
589+ }
590+
591+ public void publicMethod (String s ) {
592+ System . out. println(" I love " + s);
593+ }
594+
595+ private void privateMethod () {
596+ System . out. println(" value is " + value);
597+ }
598+ }
599+ ```
600+
601+ 2. 使用反射操作这个类的方法以及参数
602+
603+ ```java
604+ package cn. javaguide;
605+
606+ import java.lang.reflect. Field ;
607+ import java.lang.reflect. InvocationTargetException ;
608+ import java.lang.reflect. Method ;
609+
610+ public class Main {
611+ public static void main (String [] args ) throws ClassNotFoundException , NoSuchMethodException , IllegalAccessException , InstantiationException , InvocationTargetException , NoSuchFieldException {
612+ /**
613+ * 获取TargetObject类的Class对象并且创建TargetObject类实例
614+ */
615+ Class<?> tagetClass = Class . forName(" cn.javaguide.TargetObject" );
616+ TargetObject targetObject = (TargetObject ) tagetClass. newInstance();
617+ /**
618+ * 获取所有类中所有定义的方法
619+ */
620+ Method [] methods = tagetClass. getDeclaredMethods();
621+ for (Method method : methods) {
622+ System . out. println(method. getName());
623+ }
624+ /**
625+ * 获取指定方法并调用
626+ */
627+ Method publicMethod = tagetClass. getDeclaredMethod(" publicMethod" ,
628+ String . class);
629+
630+ publicMethod. invoke(targetObject, " JavaGuide" );
631+ /**
632+ * 获取指定参数并对参数进行修改
633+ */
634+ Field field = tagetClass. getDeclaredField(" value" );
635+ // 为了对类中的参数进行修改我们取消安全检查
636+ field. setAccessible(true );
637+ field. set(targetObject, " JavaGuide" );
638+ /**
639+ * 调用 private 方法
640+ */
641+ Method privateMethod = tagetClass. getDeclaredMethod(" privateMethod" );
642+ // 为了调用private方法我们取消安全检查
643+ privateMethod. setAccessible(true );
644+ privateMethod. invoke(targetObject);
645+ }
646+ }
647+
648+ ```
649+
650+ 输出内容:
651+
652+ ```
653+ publicMethod
654+ privateMethod
655+ I love JavaGuide
656+ value is JavaGuide
657+ ```
658+
659+ ### 静态编译和动态编译
660+
661+ - ** 静态编译:** 在编译时确定类型,绑定对象
662+ - ** 动态编译:** 运行时确定类型,绑定对象
663+
664+ ### 反射机制优缺点
665+
666+ - ** 优点:** 运行期类型的判断,动态加载类,提高代码灵活度。
667+ - ** 缺点:** 1 ,性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。2 ,安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。
668+
669+ ### 反射的应用场景
670+
671+ ** 反射是框架设计的灵魂。**
672+
673+ 在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring /Hibernate 等框架也大量使用到了反射机制。
674+
675+ 举例:
676+
677+ 1. 我们在使用 JDBC 连接数据库时使用 `Class . forName()`通过反射加载数据库的驱动程序;
678+ 2. Spring 框架的IOC (动态加载管理Bean )创建对象以及AOP (动态代理)功能都和反射有联系;
679+ 4. 动态配置实例的属性;
680+ 5. ......
681+
682+ ** 推荐阅读:**
683+
684+ - [Reflection :Java 反射机制的应用场景](https: // segmentfault.com/a/1190000010162647?utm_source=tuicool&utm_medium=referral)
685+ - [Java 基础之—反射(非常重要)](https: // blog.csdn.net/sinat_38259539/article/details/71799078)
686+
551687## 参考
552688
553689- https: // stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre
0 commit comments