JAVA基础之反射(下)

来源:互联网 发布:spark hbase性能优化 编辑:程序博客网 时间:2024/05/29 15:38

接下来是通过反射获取类中的方法:

public class ReflectDemo5 {

      //获取class中的方法

      publicstatic void main(String[] args) throws Exception  {

             getMethodDemo_1();

             System.out.println("--------------------");

             getMethodDemo_2();

             System.out.println("--------------------");

             getMethodDemo_3();

      }

  //获取class中的公共函数

      publicstatic void getMethodDemo_1() throws ClassNotFoundException

      {

             Classclazz=Class.forName("itheima.Person");

             //获取的都是共有方法

             Method[]methods=clazz.getMethods();

             //只获取本类中的所有方法,包括私有。

             Method[]method=clazz.getDeclaredMethods();

             //for循环迭代打印

             for(Methodmeth:methods)

             {

                    System.out.println(meth);

             }

             for(Methodmeth:method)

             {

                    System.out.println(meth);

             }

      }

    publicstatic void getMethodDemo_2() throws  Exception{

             //获取类名

             Classclazz=Class.forName("itheima.Person");

             //获取空参的show方法

             Methodmethod=clazz.getMethod("show", null);

             //创建空参实例

             Objectobj=clazz.newInstance();

             //获取构造器

             Constructorconstructor=clazz.getConstructor(int.class,String.class);;

             //设置带参构造函数

             obj=constructor.newInstance(20,"xiaoming");

             //invoke的作用是通过函数名反射相应的函数

             method.invoke(obj,null);

      }

      publicstatic void getMethodDemo_3() throws Exception

      {

       //获取类名             

         Classclazz=Class.forName("itheima.Person");

             //获取带参的paramMethod方法

             Methodmethod=clazz.getMethod("paramMethod",String.class,int.class);

         //创建一个空参对象

             Objectobj=clazz.newInstance();

         //获取构造器

             Constructorconstructor=clazz.getConstructor();

         //利用构造器创建对象

             obj=constructor.newInstance();

             //实现动态调用

         method.invoke(obj, "minin",30);

      }

}

总的来说,反射的功能有如下几个:

  1)可以判断运行时对象所属的类

  2)可以判断运行时对象所具有的成员变量和方法

  3)通过反射甚至可以调用到private的方法

一般在反射中用到的类有如下几个:

1)Class:它表示正在运行的Java应用程序中的类和接口

  2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限

  3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限

4)Method:提供关于类或接口中某个方法信息。

编写反射的一般步骤是:

  1. 必须首先获取一个类的Class对象

  2. 分别调用Class对象中的方法来获取该类的构造函数,成员变量等。

最后列举一个视频中的例子来说明反射可以给实际项目开发和维护带来很大的方便:

假设定义了一个PCI接口;

以及有一个Mainboard(主板)类:

一开始的时候只有主板运行和一个空白的配置文件,其他的功能都没有,程序如下:

之后要加入NetCardSoundCard对象但又不想修改原来的程序,这个时候就可以利用反射完成功能的扩展,只需要将扩展功能的类文件写好再把这些类的类名写到配置文件中,就可以轻松将功能加进去.

写好的NetCard文件:


写好的SoundCard文件:


最后将这两个类文件的完整类名写到配置文件中即可。

pci1=Myjava.src.xcl.NetCard

pci2=Myjava.src.xcl.SoundCard


0 0
原创粉丝点击