• Java的Reflection机制


    什么时候使用Reflection

    在java语言中,创建一个类的对象通常使用new operator,但是如果预先不知道类名,类名是在程序运行过程中通过参数传递过来,就没法使用这种方法了,这种情况下就只能使用Reflection机制了。

    使用 Reflection机制可以大大提高程序的可扩展性和可维护性(动态创建类名),所付出的代价是效率的降低。

    原理:

    当我们编译一个新创建的类就会产生一个对应Class(注意:是一个类,而不是class关键字)对象,并且这个Class对象会被保存在同名.class文件里。

    Reflection机制最常用于struts机制。

    *** struts是开源软件。使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。

    *** MVC架构:

    l  Jsp----->view(视图)

    l  Servlet------>Cotroller(控制)

    l  JavaBean------->Model(模型)

     

    使用步骤:

    1。获得Class的object。有三种方法:

         1.Class aClassObj = a.getClass();
         2.Class aClassObj = a.class();
         3.Class aClassObj = Class.forName( "a" );

    2。由于new操作会调用到constructor,所以第二步是获得constructor的object。有以下两个方法:

         1.Constructor cons = aClassObj.getConstructor( Class[] );
         2.Constructor[] cons = aClassObj.getConstructors();
         其中1中的Class[]中的每一个成员都是用来描述constructor中的参数类型的Class object。如:假如在类a中有形如constructor( String str , OutputStream out )的constructor,那么得到它的Constructor object的方法就是
         Class[] paraType = new Class [ 2 ];
         paraType[ 0 ] = String.class;
         paraType[ 1 ] = OutputStream.class;
         Constructor cons = aClassObj.getConstructor ( paraType );
         假如想利用无参constructor来获得一个Constructor的object,就要使用Constructor cons = aClassObj.newInstance()方法。

    3。获得该类实例

         public Object aObject()
         {
             Object[] paraObjArr = new Object[2];
             Object[ 0 ] = "name";
             Object[ 1 ] = new OutputStream ( "text.txt" );
             return cons.newInstance ( paraObjArr )
         }   

    4。获得该类中的方法。有以下两种方式:

          1. 使用Method allMethod []= aClassObj.getDeclaredMethods()可以得到所有该类中的方法的对象

          2.使用getMethod(参数)可以获得某个具体的方法,其中参数同获取构造函数时类似,需要paraType。假如有一个名为"setName"具有一个String类型的参数的方法,可以这样使用:

         Class[] methodParaType = new Class[ 1 ];
         methodParaType [0] = String.class;
         Method gotmethod = aClassObj.getMethod( "setName" ,methodParaType );

    5。使用该类中的方法。接着上例:

         Object[] methodPara = new Object[1];

         methodPara[0] = "wang";
         gotmethod.invoke( cons.newInstance ( paraObjArr ),methodPara );

    例:

    import java.ang.reflect.*;

    public classDumpMethods{

       public static void main (String args[]){

           try{

               Class c = Class.forName(args[0]);

    Method m[] = c.getDeclaredMethods();

    for(int i = 0; i < m.length; i++)

        System.out.println(m[i].toString());

            } catch (Throwable e){

                System.err.println(e);

            }

    }

    }

    按如下语句执行:

    java DumpMethods java.utilStack

    它的结果为:

    public java.lang.Object java.util.Stack.push(java.lang.Object)

    public synchronized java.lang.Object ava.util.Stack.pop()

    public synchronized java.lang.Object java.util.Stack.peek()

    public boolean java.util.Stack.empty()

    public synchronized int java.util.Stack.search(java.lang.Object)

    分析:

    这个程序使用Class.forName载入指定的类,然后调用getDeclaredMethods来获取这个类中定义了的方法列表。另外getDeclaredField()可以获得类的字段域、getDeclaredConstructors()可以获得类的构造函数。

  • 相关阅读:
    vue滑块拖拽校验
    vue和原生自动聚焦
    vue实现bar左右拖拽
    fastclick插件使用
    三大家族易忘点和案例
    移动端调试工具chrome+devtools
    restful 与 webapi 详解
    .NET Core 中依赖注入框架详解 Autofac
    .NET Core 对象( Transient、Scope、Singleton )生命周期详解 (对象创建以及释放)
    C# 通过DataSet 获取SQL 存储过程返回的多个结果集(tables)
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4609600.html
Copyright © 2020-2023  润新知