相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象 ( 类,属性,方法 ) 的技术,这种技术比内省机制使用范围更广泛。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。 内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:
Java代码
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 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们...
资源分类:Python库 所属语言:Python 资源全名:plone.introspector-0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
### Java中的内省与反射详解 #### 一、引言 在深入了解Java语言的过程中,我们会遇到两个重要的概念:反射和内省。这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要...
Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...
//import java.beans.BeanInfo; //import java.beans.IntrospectionException; //import java.beans.Introspector; //import java.beans.PropertyDescriptor; import com.googlecode.openbeans.BeanInfo; import ...
轻巧,快速的java.beans.Introspector重新实现,用于消除对Bean Introspection的java.desktop模块的依赖。 问题 JDK 9中引入的模块封装了Java标准库中的所有AWT,Swing,Image和Sound软件包。 除此之外,它还包含带...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。JavaBeans包(java.beans)提供了与JavaBeans组件交互的相关类和接口,这些组件是Java面向对象...
这是针对Java 1.8SE Compact Profile 1的java.beans.Introspector和关联的Descriptor类的分离实现。该代码基于openjdk源包。 目的是尽可能实现API兼容性。 在最简单的情况下,只需执行包导入重命名。 可以在GitHub上...
Struts2、Hibernate与Spring(通常简称为SSH)是Java Web开发中的三个流行框架。它们的结合可以极大地提高Web应用的开发效率和可维护性。具体来说: - **Struts2**:用于构建MVC架构的应用程序,它负责处理用户的...
Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.tar.gz) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...
│ │ ftp二进制与ascii传输方式区别.txt │ │ IPDeal.java │ │ Md5.java │ │ MD5Encrypt.java │ │ MyFileFilter.java │ │ PropsUtil.java │ │ RegExUtil.java │ │ SimpleConfig.java │ │ ...
Java 内省(Introspection)是Java提供的一种机制,允许程序在运行时检查对象的属性和方法。在Java中,内省主要用于处理JavaBean,即遵循特定规范的类,通常包含get、set方法以及默认构造器。JavaBean类使得数据封装...
- **反射机制**:该工具类大量使用了Java反射API(如`Introspector.getBeanInfo()`、`PropertyDescriptor`等)来获取和设置JavaBean的属性。 - **泛型**:使用了泛型`<T>`,使得该工具类可以应用于任意类型的...
在 Android 中,虽然没有直接使用 Bean 的 introspection,但反射(Reflection)在某些情况下仍然是有用的。 7. **Design Time Support**: Java Beans 通常用于构建可视化设计工具,如 Eclipse 或 IntelliJ IDEA 中...
在Java中,Sun公司提供的内省(Introspection)API,如java.beans.PropertyDescriptor和java.beans.Introspector,虽然强大但确实相对复杂,不便于开发者快速访问和修改Bean的属性。BeanUtils库则通过提供一套更直观...
Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.zip) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...
Java网络编程是Java开发中的重要领域,它涵盖了各种用于创建分布式系统和应用程序的技术。本教程“Java-network-high-level-programming”旨在深入解析Java在网络编程方面的高级概念和实践,包括网络进程通信、JSP...
在Java开发中,XML作为一种通用的数据交换格式,广泛用于存储和传输数据。为了方便地将XML文档转换为Java对象,以及将Java对象序列化为XML,Apache软件基金会提供了一个名为Betwixt的库。本篇文章将深入探讨如何使用...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。在Java基础学习中,理解并掌握反射是非常关键的一步,因为这不仅可以帮助你深入理解Java的内在机制,还能提升你在...