java的reflection机制_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()可以获得类的构造函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值