java的反射是什么及其用途

原文 标签 IT工具网

问题描述

反射是什么,为什么它是有用的? 我特别感兴趣的是java,但我认为任何语言的原理都是相同的。

回答

反射的概念,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。在java中,通过反射,能够在”运行态”动态获得任意一个类的所有属性和方法,动态地调用对象的方法。

举个例子,假设你有一个不知道具体类的对象,并且你想调用它的”dosomething”方法(如果存在的话)。java的静态类型系统只能调用一个已知类对象对应的已知接口,在未指定对象类型时,无法调用它的方法。但是通过反射,你的代码能检查这个未知类对象,并试图找出这个dosomething方法。如果存在这个方法,你可以通过反射调用这个方法。

为了进一步说明,请看下面的例子(下面的对象foo,就是上文提到的,我们不知道它对应的类是什么):

Method method = foo.getClass().getMethod("dosomething",null);
method.invoke(foo,null);  //调用foo的dosomething方法

反射这个特性,经常会用于各种注解中(annotations)。举个例子,Junit4将使用反射来遍历你的代码,查找所有加了@test注解的类方法,之后运行测试单元时就调用这些方法。

有很多好的反射例子,可以用来入门

最后,其概念在其他支持反射的静态类型语言中也是非常相似的。在动态语言中,无需用到上面说的第一种用法场景——调用未知类的方法(因为动态语言编允许任意对象调用任意方法,如果不存在对应方法,在运行时就会失败),但是第二种情况,查找做了指定标记的方法,这种场景还是很常见的

stackoverflow链接:What is reflection, and why is it useful?

相关文章:

JSF, Servlet 和 JSP (三种技术)有什么区别

java - "Double Brace Initialization"的效率问题

Java修饰符:public,protected,private,不加修饰符。有什么区别呢?

为什么打印“B”会明显的比打印“#”慢

java - 实现Runnable接口(interface) 和 继承Thread类

java如何处理 java.lang.outOfMemoryError PermGen space error

java怎样将堆栈追踪信息转换为字符串

java如何获取完整的堆栈信息

在java中如何对比(compare)string

java在调用 instanceof 前需要进行null检查吗