相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象 ( 类,属性,方法 )
的技术,这种技术比内省机制使用范围更广泛。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属
性的值。 内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过
getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API
可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。
一般的做法是通过类
Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(
PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter
方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:
package MyTest;
public class bean {
private String id = null ;
private String name = null ;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package MyTest;
import java.beans.BeanInfo;
import java.beans.EventSetDescriptor;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class myBeanIntrospector {
public myBeanIntrospector()
{
try
{
//实例化一个Bean
bean beanObj = new bean();
//依据Bean产生一个相关的BeanInfo类
BeanInfo bInfoObject =
Introspector.getBeanInfo(beanObj.getClass(),beanObj.getClass().getSuperclass());
//定义一个用于显示的字符串
String output = "";
//开始自省
/*
* BeanInfo.getMethodDescriptors()
* 用于获取该Bean中的所有允许公开的成员方法,以MethodDescriptor数组的形式返回
*
* MethodDescriptor类
* 用于记载一个成员方法的所有信息
* MethodDescriptor.getName()
* 获得该方法的方法名字
* MethodDescriptor.getMethod()
* 获得该方法的方法对象(Method类)
*
* Method类
* 记载一个具体的的方法的所有信息
* Method.getParameterTypes()
* 获得该方法所用到的所有参数,以Class数组的形式返回
*
* Class..getName()
* 获得该类型的名字
*/
output = "内省成员方法:\n";
MethodDescriptor[] mDescArray = bInfoObject.getMethodDescriptors();
for (int i=0;i<mDescArray.length ;i++ )
{
//获得一个成员方法描述器所代表的方法的名字
String methodName = mDescArray[i].getName();
String methodParams = new String();
//获得该方法对象
Method methodObj = mDescArray[i].getMethod();
//通过方法对象获得该方法的所有参数,以Class数组的形式返回
Class[] parameters = methodObj.getParameterTypes();
if (parameters.length>0)
{
//获得参数的类型的名字
methodParams = parameters[0].getName();
for (int j=1;j<parameters.length ;j++ )
{
methodParams = methodParams + "," + parameters[j].getName();
}
}
output += methodName + "(" + methodParams + ")\n";
}
System.out.println(output);
/*
* BeanInfo.getPropertyDescriptors()
* 用于获取该Bean中的所有允许公开的成员属性,以PropertyDescriptor数组的形式返回
*
* PropertyDescriptor类
* 用于描述一个成员属性
*
* PropertyDescriptor.getName()
* 获得该属性的名字
*
* PropertyDescriptor.getPropertyType()
* 获得该属性的数据类型,以Class的形式给出
*
*/
output = "内省成员属性:\n";
PropertyDescriptor[] mPropertyArray = bInfoObject.getPropertyDescriptors();
for (int i=0;i<mPropertyArray.length ;i++ )
{
String propertyName = mPropertyArray[i].getName();
Class propertyType = mPropertyArray[i].getPropertyType();
output += propertyName + " ( " + propertyType.getName() + " )\n";
}
System.out.println(output);
/*
* BeanInfo.getEventSetDescriptors()
* 用于获取该Bean中的所有允许公开的成员事件,以EventSetDescriptor数组的形式返回
*
* EventSetDescriptor类
* 用于描述一个成员事件
*
* EventSetDescriptor.getName()
* 获得该事件的名字
*
* EventSetDescriptor.getListenerType()
* 获得该事件所依赖的事件监听器,以Class的形式给出
*
*/
output = "内省绑定事件:\n";
EventSetDescriptor[] mEventArray = bInfoObject.getEventSetDescriptors();
for (int i=0;i<mEventArray.length ;i++ )
{
String EventName = mEventArray[i].getName();
Class listenerType = mEventArray[i].getListenerType();
output += EventName + "(" + listenerType.getName() + ")\n";
}
System.out.println(output);
System.out.println("write by esonghui :");
}
catch (Exception e)
{
System.out.println("异常:" + e);
}
}
public static void main(String[] args)
{
new myBeanIntrospector();
}
}
分享到:
相关推荐
"JAVA的内省机制(introspector)与反射机制(reflection)" JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们...
Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...
### Java中的内省与反射详解 #### 一、引言 在深入了解Java语言的过程中,我们会遇到两个重要的概念:反射和内省。这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要...
Java 内省(Introspection)是Java提供的一种机制,允许程序在运行时检查对象的属性和方法。在Java中,内省主要用于处理JavaBean,即遵循特定规范的类,通常包含get、set方法以及默认构造器。JavaBean类使得数据封装...
内省(Introspection)则是Java提供的一种用于获取和修改对象属性的能力,主要通过java.beans包中的Introspector和PropertyDescriptor类实现。它主要用于处理JavaBeans规范的对象,可以获取Bean的属性、事件和方法...
轻巧,快速的java.beans.Introspector重新实现,用于消除对Bean Introspection的java.desktop模块的依赖。 问题 JDK 9中引入的模块封装了Java标准库中的所有AWT,Swing,Image和Sound软件包。 除此之外,它还包含带...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。JavaBeans包(java.beans)提供了与JavaBeans组件交互的相关类和接口,这些组件是Java面向对象...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。在Java基础学习中,理解并掌握反射是非常关键的一步,因为这不仅可以帮助你深入理解Java的内在机制,还能提升你在...
讲一些经典的:静态导入 自动装箱/拆箱 增强for循环 可变参数 内省(Introspector) — JavaBean ......
内省是 Java 提供的一种机制,用于动态地获取对象的属性信息。通过使用 `java.beans.Introspector` 类,可以在运行时发现 JavaBean 的属性并进行操作。 在 J2EE 应用中,内省机制常用于框架自动识别 JavaBean 的...
在 Android 中,虽然没有直接使用 Bean 的 introspection,但反射(Reflection)在某些情况下仍然是有用的。 7. **Design Time Support**: Java Beans 通常用于构建可视化设计工具,如 Eclipse 或 IntelliJ IDEA 中...
- **反射机制**:该工具类大量使用了Java反射API(如`Introspector.getBeanInfo()`、`PropertyDescriptor`等)来获取和设置JavaBean的属性。 - **泛型**:使用了泛型`<T>`,使得该工具类可以应用于任意类型的...
下面将详细介绍Java反射机制及其常见应用。 首先,反射的核心类是`java.lang.Class`,它代表运行时的类信息。通过`Class`对象,我们可以获取到类的名字、构造器、方法、字段等信息。例如,我们可以通过类名获取其...
本篇文章将深入探讨如何使用Betwixt库实现XML与Java类之间的互转解析。 首先,我们需要理解Betwixt的基本概念。Betwixt是一个XML绑定工具,它允许开发者通过注解或XML配置文件来映射XML结构与Java类的属性。这种...
反射机制在 Java 中的应用 - 批量修改 Java 类某一属性 在 Java 中,反射机制是一种非常重要的技术,它可以在运行时动态地获取和修改类的信息。在本文中,我们将详细介绍如何利用反射机制批量修改 Java 类某一属性...
2. **Introspector**:Java提供了一个名为`Introspector`的工具类,它能自动查找JavaBean的属性、方法和事件,便于操作JavaBean。 3. **JSP和Servlet中的JavaBean**:在Web开发中,JavaBean常被用作JSP页面和...
Struts2是一个流行的Java web框架,它为构建MVC(模型-...总之,通过Struts2的Introspector和拦截器机制,开发者可以轻松地集成日志功能,提供透明且全面的日志记录,这对于优化和维护Java web应用来说是非常有价值的。
- **内省**是指Java程序能够访问并处理自身结构的能力。通过`java.beans`包提供的API,可以实现对象状态的查询和修改。 - 例如:使用`Introspector`和`PropertyDescriptor`来获取和设置对象的属性。 ##### 6. 注解...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。它的设计目标是提供“一次编写,到处运行”的能力,使得开发者能够编写在不同平台上运行的代码。Java白皮书是...
"Java最全的API帮助文档"是Java开发者的必备参考资料,它详尽地列出了Java平台上的所有类、接口、枚举以及注解,覆盖了Java SE(标准版)、Java EE(企业版)和Java ME(微型版)等不同领域。 `javaBeans`是Java...