java 反射详解

来源:互联网 发布:数据分析师 知乎 编辑:程序博客网 时间:2024/06/06 01:21

    在设计模式中有一个原则,尽量使用接口而非实现,所以在编译后的class文件中,接口域变量的内容信息中应该会只保存了方法接口的相关信息,而在运行时,实现类作为传入参数执行具体的方法,这样就使得定义与具体实现分离,有利于扩展。

    反射机制与接口机制存在一些相似之处,想要对一个类使用反射,必须首先要获取此类的描述信息,包括此类的方法、变量、注解、限制符、父类、子类、构造函数等信息,即首先要获取此类的class类。 在获取class文件之后,你便可以进行任何想要的操作,包括执行构造函数实例化类,执行具体的方法。

    class类既可以是接口,也可以是具体实现类,如果是具体实现类,则可以通过newInstance()方法实现对象的实例化,如果为接口则会报错。

    在具体方法的反射执行过程中,与类接口的作用方式有点类似:

    在编译期间,接口好比为一个占位符,在运行期间才会指向实现类,执行具体的操作。

     而class类的通过反射方式:method.invoke(object o,object[] args) 貌似有点类似,编译时占位,运行时根据具体的object执行具体的方法。


    那这样做的好处究竟是什么呢?----------减少了代码方法的调用过程。

     举例来说,我这里有三个类,A,B,C,项目工程中,可能用到类A,也可能用到类B,也可能用到类C。

     如果,不使用反射,则我需要具体实例化A、B、C类,后显示调用他们的方法,因此不可避免的执行三次实例化,和根据方法不同执行具体的方法调用。

     但是,如果采用反射方式,我可以通过如下代码来实现:

      String className = “”; 外界传值

       object[]   args =   外界传值

      Class<?>  objClass = Class.forName(className);

       Mehtod[] methods = objeClass.getMethods();

       for (Method method : methods)

      {

            method.invoke(objClass.newInstance(),args);

      }

       这样,就将初始化和方法调用操作进行了公共的抽取,只需要配置下参数就可以,而不需编写具体的初始化和方法调用操作