快速业务通道

反射实践 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
是适合于复杂的数据类型。

public static boolean search(Object object, String criteria)    throws IllegalArgumentException, IllegalAccessException {   List <Field> fields = ReflectionUtil.getDeclaredFields(object.getClass());   for (Field field : fields) {    field.setAccessible(true);    if (String.valueOf(field.get(object)).equalsIgnoreCase(criteria)) {     return true;    }   }   return false; }

让我们创建一个名为 Address 的新类,并用该类进行试验。该类的代码如下所示。

package ria; public class Address {   private String country;   private String county;   private String street;   private String town;   private String unit;   //Getters and setters are omitted for shortness }

反射实践(10)

时间:2011-08-09 Albert Attard

现在,让我们创建 Book 和 Address 类的一个实例并应用我们的搜索方法。

Book book = new Book(); book.setId(200); book.setName("Reflection in Action"); book.setIsbn("123456789-X"); book.setDescription("An article about reflection"); Address address = new Address(); address.setUnit("1"); address.setStreet("Republic Street"); address.setTown("Valletta"); address.setCountry("Malta"); System.out.println("Book match? " + search(book, "Valletta")); System.out.println("Address match? " + search(address, "Valletta"));

第一个匹配(针对 Book 实例的匹配)将返回 false,而地址实例将返回 true。可以针对任何对象应 用此搜索方法,而无需添加或执行任何内容。

反射的缺点

直到现在,我们仅仅讨论了反射如何好以及它如何使生活更轻松。不幸的是,任何事情都有代价。尽 管反射功能非常强大并且提供了很大的灵活性,但是我们不应该使用反射编写任何内容。如果可能的话, 在某些情况下您可能希望避免使用反射。因为反射会引入以下缺点:性能开销、安全限制以及暴露隐藏的 成员。

有时,通过访问修改程序保存逻辑。下面的代码片段就是一个鲜明的例子:

public class Student {   private String name;   public Student(String name){    this.name = name;   } }

当初始化对象后,只能通过构造函数更改学生的姓名。使用反射,您可以将学生的姓名设置任何 String,甚至在初始化对象之后也可以。正如您所见到的一样,这样会打乱业务逻辑并且可能会使程序行 为不可预测。

与大多数其他编译器一样,Java 编译器尝试尽可能多的优化代码。对于反射这是不可能的,因为反射 是在运行时解析类型,而编译器是在编译时工作。此外,必须在稍后的阶段即运行时解析类型。

结束语

反射可用于在不同对象中实现相同的逻辑(如搜索), 而不需要为每个新类型都创建新代码。这样也 有利于对逻辑进行集中管理。遗憾的是,反射也存在缺点,它有时会增加代码的复杂性。性能是对反射的 另一个负面影响,因为无法在此类代码上执行优化。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号