快速业务通道

反射实践 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

Book book = new Book(); ReflectionUtil.setFieldValue(book, "id", 1234L); System.out.println(book.getId());

上面的代码将产生以下输出:1234.

通过反射调用方法

或许您已经猜到,调用方法与创建新实例以及访问上面讨论的字段非常类似。

就涉及的反射而言,所有方法都具有参数并且返回值。这听起来可能比较奇怪,但它确实是这样。让 我们分析下面的方法:

public void doNothing(){   // This method doesn''t do anything }

该方法具有一个类型为 void 的返回类型,还有一个空的参数列表。可以采用以下方式通过反射调用 该方法。

Class<?> clazz = object.getClass(); Method method = Clazz.getDeclaredMethod("doNothing"); method.invoke(object, new Object[0]);

invoke 方法来自 Method 类,需要两个参数:将调用方法的实例以及作为对象数组的参数列表。请注 意,方法 doNothing() 没有参数。尽管这样,我们仍然还需要将参数指定为空的对象数组。

方法还具有一个返回类型;本例中为 void。可以将该返回类型(如果有)另存为 Object,某些内容 类似于以下示例。

Object returnValue = method.invoke(object, new Object[0]);

在本例中,返回值为 null,因为该方法不返回任何值。请注意,方法可以故意返回 null,但这样可 能会有点混淆。

完成此部分之前,理解可以采用与字段相同的方式继承方法,这一点非常重要。我们可以使用另一种 实用方法在层次结构中检索该方法,而不是只从手边的类中检索。

public static Method getDeclaredMethod(Object object, String name)    throws NoSuchMethodException {   Method method = null;   Class<?> clazz = object.getClass();   do {    try {     method = clazz.getDeclaredMethod(name);    } catch (Exception e) { }   } while (method == null & (clazz = clazz.getSuperclass()) != null);   if (method == null) {    throw new NoSuchMethodException();   }   return method; }

最后,下面列出了范型 invoke 方法。请再次注意,方法可以是 private,因此在调用它们之前最好 设置它们的可访问性。

反射实践(9)

时间:2011-08-09 Albert Attard

应用程序中的反射

直到现在,我们仅创建了食用方法并且试验了几个简单的示例。实际的编程需要的不只这些。想像我 们需要搜索我们的对象并确定给定对象是否符合某些条件。第一个选项是编写一个接口并在每个对象(如 果该实例符合条件,则对象返回 true,否则返回 false)中实现它。不幸的是,该方法要求我们在我们 拥有的每个类中执行一个方法。新的类不许实现该接口并为其抽象方法提供主要部分。或者,我们也可以 使用反射检索对象的字段并检查它们的值是否符合条件。

让我们首先创建另一个返回该对象字段的方法。请记住,没有一种内置的方法可以返回所有字段,包 括继承的字段。因此,我们需要通过逐组提取它们来亲自检索它们,直到我们达到层次结构的顶部为止。 可以向 ReflectionUtil 类中添加该方法。

public static List <Field> getDeclaredFields(Class clazz) {   List<Field> fields = new ArrayList<Field>();   do {    try {     fields.addAll(Arrays.asList(clazz.getDeclaredFields()));    } catch (Exception e) { }   } while ((clazz = clazz.getSuperclass()) != null);   return fields; }

现在,我们只需要让它们的字符串值与给定的条件相匹配,如下面的代码片段中所示。使用 String 方法 valueOf(Object) 将字段的值转换为字符串,而不返回 null 或抛出任何异常。请注意,这可能并 不总

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号