栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么是java反射,为什么有用?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么是java反射,为什么有用?

名称反射用于描述能够检查同一系统(或本身)中其他代码的代码。

例如,假设你在Java中有一个未知类型的对象,并且你想在该对象上调用“ doSomething”方法(如果存在)。除非对象符合已知的接口,否则Java的静态类型化系统并不是真正为支持该类型而设计的,但是使用反射,你的代码可以查看该对象并确定其是否具有名为“ doSomething”的方法,然后在需要时调用该方法。想要。

因此,为你提供一个Java代码示例(假设有问题的对象是foo):

Method method = foo.getClass().getMethod("doSomething", null);method.invoke(foo, null);

Java中一种非常常见的用例是带注释的用法。例如,JUnit 4将使用反射来遍历类,以查找带有@Test批注的方法,然后在运行单元测试时调用它们。

有一些不错的反思示例,可帮助你入门:

http://docs.oracle.com/javase/tutorial/reflect/index.html

最后,是的,在支持反射的其他静态类型语言(如C#)中,这些概念非常相似。在动态类型的语言中,上述用例不是必需的(因为编译器将允许在任何对象上调用任何方法,如果不存在则在运行时失败),但是第二种情况是查找标记或以某种方式工作仍然很普遍。

我最喜欢的反射用法之一是下面的Java转储方法。它使用任何对象作为参数,并使用Java反射API打印出每个字段名称和值。

import java.lang.reflect.Array;import java.lang.reflect.Field;public static String dump(Object o, int callCount) {    callCount++;    StringBuffer tabs = new StringBuffer();    for (int k = 0; k < callCount; k++) {        tabs.append("t");    }    StringBuffer buffer = new StringBuffer();    Class oClass = o.getClass();    if (oClass.isArray()) {        buffer.append("n");        buffer.append(tabs.toString());        buffer.append("[");        for (int i = 0; i < Array.getLength(o); i++) { if (i < 0)     buffer.append(","); Object value = Array.get(o, i); if (value.getClass().isPrimitive() ||         value.getClass() == java.lang.Long.class ||         value.getClass() == java.lang.String.class ||         value.getClass() == java.lang.Integer.class ||         value.getClass() == java.lang.Boolean.class         ) {     buffer.append(value); } else {     buffer.append(dump(value, callCount)); }        }        buffer.append(tabs.toString());        buffer.append("]n");    } else {        buffer.append("n");        buffer.append(tabs.toString());        buffer.append("{n");        while (oClass != null) { Field[] fields = oClass.getDeclaredFields(); for (int i = 0; i < fields.length; i++) {     buffer.append(tabs.toString());     fields[i].setAccessible(true);     buffer.append(fields[i].getName());     buffer.append("=");     try {         Object value = fields[i].get(o);         if (value != null) {  if (value.getClass().isPrimitive() ||          value.getClass() == java.lang.Long.class ||          value.getClass() == java.lang.String.class ||          value.getClass() == java.lang.Integer.class ||          value.getClass() == java.lang.Boolean.class          ) {      buffer.append(value);  } else {      buffer.append(dump(value, callCount));  }         }     } catch (IllegalAccessException e) {         buffer.append(e.getMessage());     }     buffer.append("n"); } oClass = oClass.getSuperclass();        }        buffer.append(tabs.toString());        buffer.append("}n");    }    return buffer.toString();}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369492.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号