Java学习总结之反射

反射,在基本的Java SE 中应用并不多,至少在刚刚学习的时候很少见到,但是随着学习的逐步深入,特别是如果想要向 Java EE 发展,则反射是必须掌握的一个内容。

在这里,我就不像书上那样长篇大论前前后后方方面面都讲清楚了,如果有遇到不理解的地方,读者可以留言或者查阅相关书籍,我在这里主要就讲讲我对反射的看法和反射的用法。

在我看来呢,反射这个名字起得不好,至少我没看出来所谓的“反射”与它的字面意思有什么联系。在我的理解中,“反射”就是“动态”的加载类,使用类。什么是动态呢?就是说在写代码的时候你可以不知道具体要加载的是什么类,而是在运行的时候从配置文件中读取类名并加载,然后再创建实例、调用方法等。

当然,不知道具体是哪个类不代表你对要加载的类一无所知,要知道一个大概的范围,比如说,不知道会加载类A1、A2、A3还是A4,但是你要知道这里加载的是A类型的类,因为如果你要是对要加载的类一无所知的话,加载以后你也不会知道该如何应用这个类。你应该知道加载类以后,要用什么来接收创建的实例,要用到它的什么方法等。换句话说,反射其实是多态的一种应用。因为用来接收加载类的成员一般都声明为该类的父类或实现的接口,而可能加载的则是该类的兄弟类,都实现了同一个接口或继承自同一父类,这样才会有相同的方法。

反射用的很广泛的一个地方就是框架,在对类的选择可能发生变化的地方使用反射,可以减少对源代码的修改,将之变为对配置文件的修改

具体使用方法如下:

加载:Class c = Class.forName(类名);  //类名是个字符串,可以来自配置文件、运行期的值或者参数等。通过类加载器找到该类并加载

创建实例:Object  o  =  c.newInstance();//这是创建无参实例的方法

         至于带参的,比如第一个参数为String 类型,第二个为int 类型。则步骤如下:

        Class[  ]  params  =  new  Class[ 2 ];//指定参数类型

        params[ 0 ]  =  String.class;  params [ 1 ]  =  Integer.TYPE;

       

       Constructor  constructor  =  c.getConstructor(params);//取得构造方法

      

       Object  values  =  new  Object [ 2 ] ; //指定参数值

       values [ 0 ] = "A" ;  values [ 1 ] =  new  Integer(90);

      

       Object  o  =  constructor.newInstance(values);//创建实例

调用方法:Method  method  =  c.getMethod(方法名);  //方法名为字符串

                    method.invoke(  o ); //invoke方法参数为之前创建的实例 o  

        带参方法的调用:参数为一个String

                    Class[  ]  param1 = {String.class}; //设置参数类型

                    Method  method  =  c.getMethod(方法名,param1);

                    Object  object1  =  {“abc”};//设置参数值

                    method.invoke( o, object1);

此外还有访问成员属性,但是这个不推荐,建议对成员属性的操作通过setter 和getter 来完成。

此外Class类还有许多方法,如getReturnTpye、getParameterType、getModifiers、getName等,读者可自行查阅API 文档。

你可能感兴趣的:(Java学习总结)