java反射机制系列(三)例子分析

上一篇中,通过例子我们知道了如何利用反射机制创建对象,获得类变量和调用方法等。创建对象的语句是  Class cla = Class.forName(type);    Object obj = cla.newInstance();这里newInstance()实际上是使用了该类的默认无参构造方法。如果我们要调用其它的构造方法就要稍微复杂一点。比如我们要创建一个 StringBuffer对象,用new 操作符应该是StringBuffer br = new StringBuffer("example");用反射机制则要有以下步骤。

    首先,获得StringBuffer类的描述。

    Class cla = Class.forName("java.lang.StringBuffer");其次,要创建参数类型数组Class[] . Class[] paraTypes = new Class[1];paraTypes[0]=String.class;然后,通过cla 和 paraTypes 获得Constructor 对象。

    Constructor constructor = cla.getConstructor(paraTypes);接着,创建传入的参数列表Object[]. Object[] paraLists = new Object[1]; paraLists[0]="color";最后,得到我们所要得对象。Object obj = constructor.newInstance(paraLists);如果我们paraTypes及paraLists设为null或长度为0,就可以用上述步骤调用StringBuffer的无参构造方法。类似地,我们可以调用对象中的有参方法。比如我们做如下操作br.insert(4, 'u');用反射机制实现如下。

Class[] paratypes = new Class[]{int.class,char.class};
Method method = cla.getMethod("insert", paratypes);
Object[] paralists = new Object[]{4,'u'};
method.invoke(obj, paralists);

 

 

   反射机制给予我们运行时才确定对象类型的便利,然而它也有显著的缺点。

    1,代码笨拙冗长。比如本来一句br.insert(4, 'u');可以解决的问题现在要用到四句。

    2,损失了编译时类型检查的好处。这使得你要对付更多的异常。

    3,性能损失。用反射机制运行的时间更久。

    <<Effective Java >>中给出的建议是“普通应用不应在运行时刻以映像方式访问对象,只是在很有限的情况下使用”。那么在什么地方会用到反射机制呢。已有的较熟悉应用是我们的IDE及一些框架。比如eclipse,编程时ctrl+space弹出的建议就是用到反射机制。比如Spring读取配置文件后生成对应的对象。还有RPC系统也会用到。对于一般的应用软件,你可以在工厂方法中用到它。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值