软件设计:Java的反射技术

    作者:HHH燕 更新于: 2020-04-11 22:06:51

      java反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

      1、java反射技术

      Java反射技术应用广泛,它能够配置:类的全限定名、方法和参数,完成对象的初始化,甚至是反射某些方法。这样可以大大增强Java的可配置性,如SpringIoC的基本原理也是反射,当然SpringIoC的代码要复炸得多,还有其他的技术结合。

      Java的反射内容繁多,包括对象的构建、反射方法、注解、参数、接口等。这次主要讲一下对象的构建和反射的方法。在Java中,反射是通过包java.lang.reflect.*来实现的。

      2、通过反射构建对象

      在Java中允许通过反射配置信息构造对象。

      首先创建一个对象:

      packagecom.hhh.learn.reflect;

      /**

      *对象

      *@authorchao

      *

      */

      publicclassReflectServiceImpl{

      privateStringname;

      //不带参的构造方法

      publicReflectServiceImpl(){}

      //带参构造方法

      publicReflectServiceImpl(Stringname){

      this.name=name;

      }

      publicvoidsayHello(Stringname){

      System.out.println("Hello!"+name);

      }

      publicvoidsayHello(){

      System.out.println("Hello!"+name);

      }

      }

      然后通过反射方法去构造这个对象,如下代码:

      //不带参

      publicReflectServiceImplgetInstance(){

      ReflectServiceImplobject=null;

      try{

      object=(ReflectServiceImpl)Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance();

      }catch(Exceptione){

      e.printStackTrace();

      }

      returnobject;

      }

      这里的代码就可以利用反射去构造了一个ReflectServiceImpl对象。其实利用反射方法构造对象就是给类加载器注册了一个类的全限定名,再通过newInstance()的方法来初始化一个对象。

      若要构造带参的对象,可以查看以下代码:

      publicReflectServiceImplgetInstance2(){

      ReflectServiceImplobject=null;

      try{

      object=(ReflectServiceImpl)Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").getConstructor(String.class).newInstance("张三");

      }catch(Exceptione){

      e.printStackTrace();

      }

      returnobject;

      }

      先通过forName()的方法将类加载到加载器中,再通过getConstructor()方法选择哪一个构造方法,最后通过newInstance()的方法来初始化一个对象。

      3、反射方法

      再上面我们已经构造了对象,就可以调用他们的方法了,代码如下:

      ReflectServiceImplobject=null;

      try{

      object=(ReflectServiceImpl)Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance();

      Methodmethod=object.getClass().getMethod("sayHello",String.class);

      method.invoke(object,"李四");

      }catch(Exceptione){

      e.printStackTrace();

      }

      对象构造好,通过getClass()的方法获取对应的对象,再通过getMethod()方法获取对应的方法,里面填调用的方法名和参数的类型,最后就调用invoke()方法执行对应的方法,里面要写明对象和参数的值。通过这样就可以利用反射的方式去调用方法了。

      4、反射的优点和缺点

      反射的优点:只要配置就可以生成对象,可以解除程序的耦合度,比较灵活,大大增强的可配置性和可扩展性。

      反射的缺点:运行比较慢。

      JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言"。从这个观点看,perlPython,Ruby是动态语言,C++,Java,C#不是动态语言。

    标签: perlPythonRuby

课课家教育

未登录

1