java反射和内省的很好解释。相信大家看了这篇文章,对这两个感念会有深刻的认识:哦,原来如此。
JAVA语言的反射和内省
很多朋友在深入的接触
JAVA
语言后就会发现这样两个词:反射
(Reflection)
和内省
(Introspector)
,经常搞不清楚这到底是怎么回事,在什么场合下应用以及如何使用?今天
把这二者放在一起介绍,因为它们二者是相辅相成的。
反射
相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就
是让你可以通过名称来得到对象
(
类,属性,方法
)
的技术。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可
以调用这个方法;知道了属性名就可以访问这个属性的值。
还是写两个例子让大家更直观的了解反射的使用方法:
//
通过类名来构造一
个类的实例
Class cls_str = Class.forName(
"java.lang.String"
);
//
上面这句很眼熟,因为使用过
JDBC
访问数据库的人都用过
J
Object str = cls_str.newInstance();
//
相当于
String str = new String();
|
//
通过方法名来调用
一个方法
String methodName =
"length"
;
Method m = cls_str.getMethod(methodName,
null
);
System.out.println(
"length is "
+ m.invoke(str,
null
));
//
相当于
System.out.println(str.length());
|
上面的两个例子是比较常用方法。看到上面的例子就有人要发问了:为什么
要这么麻烦呢?本来一条语句就完成的事情干吗要整这么复杂?没错,在上面的例子中确实没有必要这么麻烦。不过你想像这样一个应用程序,它支持动态的功能扩
展,也就是说程序不重新启动但是可以自动加载新的功能,这个功能使用一个具体类来表示。首先我们必须为这些功能定义一个接口类,然后我们要求所有扩展的功
能类必须实现我指定的接口,这个规定了应用程序和可扩展功能之间的接口规则,但是怎么动态加载呢?我们必须让应用程序知道要扩展的功能类的类名,比如是
test.Func1
,当我们把这个类名
(
字符串
)
告诉应用程序后,它就可以使用我们第一个例子的方法来加载并启用新的功
能。这就是类的反射,请问你有别的选择吗?
关于方法的反射建议大家看我的另外一篇文章《
利用
Turbine
的事件映射来扩展
Struts
的功能
》,地址是:
http://www.javayou.com/article/CSDN/extend_struts.html
。这篇文章详细介绍了如果通过反射来扩展
Struts
框架的功能。
内省
内省是
Java
语言对
Bean
类属性、事件的一种缺省处理方法。例如类
A
中有属性
name,
那我们可以通过
getName,setName
来得到其值或者设置新的值。通过
getName/setName
来访问
name
属性,这就是默认的规则。
Java
中提供了一套
API
用来访问某个属性的
getter/setter
方法,通过这些
API
可以使你不需要了解这个规则(但你最好还是要搞清楚),这些
API
存放于包
java.beans
中。
一般的做法是通过类
Introspector
来获取某个对象的
BeanInfo
信息,然后通过
BeanInfo
来获取属性的描述器(
PropertyDescriptor
),通过这个属性描述器就可以获取某个属性对应的
getter/setter
方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例
子,这个例子把某个对象的所有属性名称和值都打印出来:
/*
* Created on 2004-6-29
*/
package
demo;
import
java.beans.BeanInfo;
import
java.beans.Introspector;
import
java.beans.PropertyDescriptor;
/**
*
内省演示例子
*
@author
liudong
*/
public
class
IntrospectorDemo {
String name;
public
static
void
main(String[] args)
throws
Exception{
IntrospectorDemo demo =
new
IntrospectorDemo();
demo.setName(
"Winter Lau"
);
//
如果不想把父类的
属性也列出来的话,
//
那
getBeanInfo
的第二个参数填写
父类的信息
BeanInfo bi =
Introspector.getBeanInfo(demo.getClass(),
Object.
class
);
PropertyDescriptor[] props =
bi.getPropertyDescriptors();
for
(
int
i=0;i<props.length;i++){
System.out.println(props[i].getName()+
"="
+
props[i].getReadMethod().invoke(demo,
null
));
}
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
}
|
Web
开发框架
Struts
中的
FormBean
就是通过内省机制来将表单中的数据映射到类的属性上,因此要求
FormBean
的每个属性要有
getter/setter
方法。但也并不总是这样,什么意思呢?就是说对一个
Bean
类来讲,我可以没有属性,但是只要有
getter/setter
方法中的其中一个,那么
Java
的内省机制就会认为存在一个属性,比如类中有方法
setMobile
,那么就认为存在一个
mobile
的属性,这样可以方便我们把
Bean
类通过一个接口来定义而不用去关心具体实现,不用去关心
Bean
中数据的存储。比如我们可以把所有的
getter/setter
方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可
提高系统的扩展性。
总结
将
Java
的反射以及内省应用到程序设计中去可以大大的提供程序的智能化和可扩展
性。有很多项目都是采取这两种技术来实现其核心功能,例如我们前面提到的
Struts
,还有用于处理
XML
文件的
Digester
项目,其实应该说几乎所有的项目都或多或少的采用这两种技术。在实际应
用过程中二者要相互结合方能发挥真正的智能化以及高度可扩展性。
分享到:
相关推荐
Java反射与内省是Java编程语言中的核心特性,它们为开发者提供了强大的能力,可以在运行时检查和操作类、接口、对象及其属性。本PPT深入探讨了这些概念,旨在帮助开发者充分利用Java平台的灵活性。 首先,Java反射...
java 反射机制是 Java 语言中的一种动态获取信息和调用对象方法的技术核心。它允许在程序运行时加载、探索以及使用编译期间完全未知的 .class 文件。通过反射机制,可以在运行时判断任意一个对象所属的类、构造任意...
本篇文章将深入探讨如何利用反射和内省技术来实现一个简单的Spring IOC。首先,我们来理解什么是反射和内省。 反射是Java提供的一种强大的动态类型机制,它允许程序在运行时检查类的信息,如类名、属性、方法等,并...
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射...以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和运用这一重要特性。
反射和内省都是Java中非常强大的特性,能够显著提高程序的灵活性和可扩展性。通过对类和对象的元数据进行操作,这两种技术使得开发者能够在运行时动态地改变程序的行为,这对于构建高度灵活的应用系统至关重要。掌握...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们有什么区别和联系? 一、内省机制(introspector) 内省...
Java反射机制允许程序在运行时通过`Reflection APIs`获取类的内部信息,包括修饰符(如`public`、`static`等)、父类(如`Object`)、接口(如`Cloneable`)以及字段和方法的信息,并能够在运行时改变字段的值或调用...
总之,Java反射机制提供了强大的动态性,允许我们在运行时探索和操作类的结构,这在许多高级功能和框架中都扮演着重要角色。然而,使用反射时需要谨慎,因为它可能会引入安全风险和性能损失。理解反射的工作原理以及...
在这个"酷炫javaweb后台系统"中,包含了一些核心的JavaWeb技术和编程理念,如封装、反射和内省等。这些概念是Java编程的重要组成部分,对于理解和构建高效的应用程序至关重要。 首先,让我们来探讨一下"封装"。封装...
Java IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented ...在源码和工具方面,我们可以学习到如何利用Java的内省API进行类信息的获取,以及如何利用反射和动态代理来实现依赖注入和面向切面编程。
在Java编程语言中,反射和内省是两个强大的特性,它们允许程序在运行时检查类、接口、字段和方法的信息,甚至动态地调用方法和访问属性。"minimalcode-reflect"项目提供了一个简约的框架,专注于JavaBean的反射和...
Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...
Java反射机制是一种在运行时查询、监视和操作类、方法、字段和对象的机制,其提供了一种强大的编程能力,允许程序在运行时进行自我检查和调整行为。Java Reflection in Action这本书作为Java反射机制的经典之作,...
- 框架开发:许多Java框架如Spring,Struts等利用内省和BeanUtils来实现依赖注入和控制反转。 了解和掌握内省、Apache Commons BeanUtils以及Commons Logging,对于提高Java开发效率和编写更灵活的代码至关重要。...
由于Java和.NET平台上反射技术的成功应用,反射技术从理论研究走向了实用阶段,动态获取和调整系统行为的能力得到了强化。动态反射技术尤其在需要编写扩展性较强的代码,处理程序设计时不确定的对象方面表现出了显著...