内省(IntroSpector)是Java语言对JavaBean 类属性、事件的一种缺省处理方法。
例如类A中有属性name, 那我们可以通过getName,setName 来得到其值或者设置新的值。
通过getName/setName 来访问name属性,这就是默认的规则。
Java中提供了一套API 用来访问某个属性的getter/setter方法,通过这些API 可以使你不需要了解这个规则,这些API存放于包java.beans 中。
一般的做法是通过类Introspector的getBeanInfo方法获取某个对象的BeanInfo 信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。
我们又通常把javabean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法。
一个JavaBean类可以不当JavaBean用,而当成普通类用。JavaBean实际就是一种规范,当一个类满足这个规范,这个类就能被其它特定的类调用。一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。去掉set前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
除了反射用到的类需要引入外,内省需要引入的类如下所示,它们都属于java.beans包中的类,自己写程序的时候也不能忘了引入相应的包或者类。下面代码片断是设置某个JavaBean类某个属性的关键代码:
package com.ljq.test;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.commons.beanutils.BeanUtils;
publicclass IntrospectorTest {
public static void main(String[] args) throws IllegalArgumentException,
IntrospectionException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
UserInfo userInfo=new UserInfo("zhangsan", "123456");
String propertyName="userName";
Object retVal=getProperty(userInfo, propertyName);
System.out.println("retVal="+retVal); //retVal=zhangsan
Object value="abc";
setProperty(userInfo, propertyName, value);
retVal=getProperty(userInfo, propertyName);
System.out.println("retVal="+retVal); //retVal=abc
//使用BeanUtils工具包操作JavaBean
String userName=BeanUtils.getProperty(userInfo, propertyName);
System.out.println("userName="+userName);
BeanUtils.setProperty(userInfo, propertyName, "linjiqin");
userName=BeanUtils.getProperty(userInfo, propertyName);
System.out.println("userName="+userName);
}
/**
* 设置属性
*
* @param clazz 对象名
* @param propertyName 属性名
* @param value 属性值
*/
private static void setProperty(Object clazz, String propertyName, Object value)
throws IntrospectionException,IllegalAccessException, InvocationTargetException{
//方法一
/*PropertyDescriptor pd=new PropertyDescriptor(propertyName, clazz.getClass());
Method methodSet=pd.getWriteMethod();
methodSet.invoke(clazz, value);*/
//方法二
BeanInfo beanInfo=Introspector.getBeanInfo(clazz.getClass());
PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
if(propertyName.equals(pd.getName())){
Method methodSet=pd.getWriteMethod();
methodSet.invoke(clazz, value);
break;
}
}
}
/**
* 获取属性
*
* @param clazz 对象名
* @param propertyName 属性名
* @return
* @throws IntrospectionException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
private static Object getProperty(Object clazz, String propertyName)
throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
//方法一
/*PropertyDescriptor pd=new PropertyDescriptor(propertyName, clazz.getClass());
Method methodGet=pd.getReadMethod();
return methodGet.invoke(clazz);*/
//方法二
Object retVal=null;
BeanInfo beanInfo=Introspector.getBeanInfo(clazz.getClass());
PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
if(propertyName.equals(pd.getName())){
Method methodGet=pd.getReadMethod();
retVal=methodGet.invoke(clazz);
break;
}
}
return retVal;
}
}
分享到:
相关推荐
"JAVA的内省机制(introspector)与反射机制(reflection)" JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们...
Struts2是一个流行的Java web框架,它为构建MVC(模型-...总之,通过Struts2的Introspector和拦截器机制,开发者可以轻松地集成日志功能,提供透明且全面的日志记录,这对于优化和维护Java web应用来说是非常有价值的。
Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.zip) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...
Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.tar.gz) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...
骨干内省者骨干应用程序自省-生成应用程序组件的树状图(使用d3.js)要求骨干应用装有require.js的模块预习 还检查TodirMVC实现的示例目录安装在您的main.js中require ( ['backbone' ,'views/app' ,'routers/router'...
内省在实际开发中有着广泛的应用,比如框架中的数据绑定、对象克隆、XML反序列化等场景。通过内省,开发者可以在运行时动态地发现和操作Java对象的属性,提高了代码的灵活性和可扩展性。然而,内省也有一些缺点,如...
在`contextDestroyed()`方法中,`IntrospectorCleanupListener`会调用`Introspector.flushCaches()`,确保在Web应用关闭时清理所有与`Introspector`相关的缓存,防止内存泄漏。 需要注意的是,Spring自身在处理Bean...
Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...
在实际应用中,app-introspector可以用于监控应用程序的健康状况,检测潜在的性能瓶颈,或者在出现问题时快速定位错误源。对于大型分布式系统,这样的实时诊断能力尤其宝贵,因为它允许开发者无需重启服务就能对系统...
特征: 设置和使用简单与 iOS Simulator 配套桌面应用程序兼容 - 在运行时从桌面应用程序或设备(点击状态栏)向所选视图发送消息(调用任何方法) 通过应用程序范围的键盘命令控制突出显示视图框架显示视图原点和...
- **IntrospectorCleanupListener**:这是一个Spring提供的监听器,用于防止`java.beans.Introspector`类引发的内存泄漏问题。将其配置在`ContextLoaderListener`之前可以确保先清理再初始化Spring容器。 - **...
这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要。本文将详细介绍这两者的基本原理、应用场景以及如何在Java中使用它们。 #### 二、反射 ##### 2.1 概念解释 反射...
4. **Introspector**:提供对Java对象的元数据信息,帮助JavaScript更好地理解和操作Java对象。 5. **AutoComplete**和**LiveForm**:这两个组件提供了常见的用户界面功能,如自动完成输入和实时表单验证。 **DWR...
3. **Introspector组件**:Java内置的Introspector类可以自动发现JavaBean的属性、事件和方法,这对于构建用户界面或自动化工具非常有用。 4. **BeanInfo类**:扩展JavaBean的元数据信息,可以自定义默认的行为和...
2. **Introspector**:Java提供了一个名为`Introspector`的工具类,它能自动查找JavaBean的属性、方法和事件,便于操作JavaBean。 3. **JSP和Servlet中的JavaBean**:在Web开发中,JavaBean常被用作JSP页面和...
5. **Introspection和Serialization**:理解JavaBean introspector的工作原理,它是如何获取Bean信息的,以及如何实现序列化来持久化Bean的状态。 6. **JavaBean在MVC架构中的角色**:在模型-视图-控制器(MVC)架构...
- **JavaBean规范**:一个JavaBean应是公共的、非抽象的类,具有无参数的构造函数,属性通过getter和setter方法访问,并且可以通过JavaBeans Introspector获取元数据。 - **作用**:JavaBean在Web开发中常用作...
`java.beans.Introspector`类提供了这些功能。 7. **BeanInfo类**:BeanInfo类可以提供关于JavaBean的元数据,包括属性、事件和方法的描述,以及自定义的默认行为。如果JavaBean没有提供BeanInfo,JavaBeans API会...
书中可能讨论了JavaBeans的设计原则、属性、事件和方法,以及如何利用Introspector工具进行反射操作。 2. **Servlets**:Servlets是Java中处理HTTP请求的服务器端组件,用于构建动态Web应用程序。书里可能详细介绍...
- **Spring ApplicationContext Listener**:在Web应用启动时加载Spring容器,确保Spring容器可以在应用启动时初始化。 - **Spring Introspector清理Listener**:用于清理Spring中的元数据信息,防止内存泄漏。 综...