Introspector 内省是javase里很基础的知识点了,但在做项目的时候经常会使用到, struts2的action(还有struts1的formbean)也使用了内省机制提供的实现。前台的form标签具有一些属性(在配置文件中知道这个form提交到那个action,而这个action有和这个form相对应的属性及其 get/set),提交以后,由struts的servlet拦下来转发给某个具体的action.而在转发给action之前struts通过内省的方 式将form中的值set到了action中去。
一、Java内省机制
内省是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。
例如类 IntroBean 中有属性 name, value那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),
通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。
即使 类里没有 doub属性,只要类里有getDoub,setDoub属性,我们也可以通过BeanInfo来获取属性的描述器,再通过这个属性描述器就获取 getter/setter 方法 :看下下面代码来理解。
提供一个IntroBean 这样一个简单的bean类,其中没有doub属性,但提供了个getDoub ,setDoub方法
package com.jian; public class IntroBean { String name; Integer value; public Double getDoub() { System.out.println("invoke getdoub!"); return null; } public void setDoub(Double doub) { System.out.println("invoke setdoub"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getValue() { return value; } public void setValue(Integer value) { this.value = value; } public void Value(Integer value) { } public void aaValue(Integer value) { } }
从下面可以看出是根据bean 类里的set ,get 方法来构建PropertyDescriptor
package com.jian; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; public class IntrospectorTest { public static void main(String[] args) throws IntrospectionException { BeanInfo bi= Introspector.getBeanInfo(IntroBean.class,Object.class); PropertyDescriptor[] pd= bi.getPropertyDescriptors(); String np; for(int i=0;i<pd.length;i++){ np= pd[i].getReadMethod().getName();//ReadMethod就是读取,相当于getMethod(); System.out.println("read ="+np); np=pd[i].getWriteMethod().getName();//WriteMethod就是设置,相当于setMethod(); System.out.println("write ="+np); System.out.println("----------------"); } } } 运行结果: read =getDoub write =setDoub ---------------- read =getName write =setName ---------------- read =getValue write =setValue ----------------
即使 类里没有 doub属性,只要类里有getDoub,setDoub属性,我们也可以通过BeanInfo来获取属性的描述器(PropertyDescriptor),再通过这个属性描述器就获取 getter/setter 方法.
相关推荐
JAVA的内省机制(introspector)与反射机制(reflection).docx
主要介绍了Java 内省introspector相关原理代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java 内省(Introspector)深入理解的相关资料,需要的朋友可以参考下
资源分类:Python库 所属语言:Python 资源全名:plone.introspector-0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
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 开发。 ...
轻巧,快速的java.beans.Introspector重新实现,用于消除对Bean Introspection的java.desktop模块的依赖。 问题 JDK 9中引入的模块封装了Java标准库中的所有AWT,Swing,Image和Sound软件包。 除此之外,它还包含带...
这个包是一个薄包装器,它从内省中检索建议: 安装 使用 Atom 包管理器,它可以在设置视图中找到,或者从命令行运行apm install php-introspector 。 您还需要安装软件包。 用法 目前,自动完成依赖于从远程(或...
NULL 博文链接:https://liuna718-163-com.iteye.com/blog/1731217
骨干内省者骨干应用程序自省-生成应用程序组件的树状图(使用d3.js)要求骨干应用装有require.js的模块预习 还检查TodirMVC实现的示例目录安装在您的main.js中require ( ['backbone' ,'views/app' ,'routers/router'...
Eclipse 平台的 COM 内省器和代码生成器
Introspector使处理源代码的编程工具(例如编译器)能够以标准且中立的方式进行通信,从而减少了意外的编程成本。 http://github.com/h4ck3rm1k3/
讲一些经典的:静态导入 自动装箱/拆箱 增强for循环 可变参数 内省(Introspector) — JavaBean ......
//import java.beans.Introspector; //import java.beans.PropertyDescriptor; import com.googlecode.openbeans.BeanInfo; import com.googlecode.openbeans.IntrospectionException; import ...
CBIntrospectorIntrospector 是一小组适用于iOS 6+和 iOS 模拟器的工具,可帮助调试使用 UIKit 构建的用户界面。 它对于动态创建或可以在运行时更改的 UI 布局,或者通过查找非不透明视图或不必要地重新绘制的视图来...
在由JDK提供的默认的API中,有java.beans包,里面有诸如Introspector,BeanInfo,PropertyDescriptor等用来操作JavaBean的方法, 但是由Apache公司开发的BeanUtils会更常用,同时,BeanUtils还需要配合第三方日志...
app-introspector.zip,一个简单的spring插件,用于在运行时诊断和检查springbean。它提供基于json的服务
在android studio 中无法使用 BeanInfo,IntrospectionException,Introspector, PropertyDescriptor 这些类,只需要导入这个jar 库就可以了。 只不过,要把java.beans.BeanInfo; 替换为 ...
springmvc的资源配置:Spring 刷新Introspector防止内存泄露,Spring MVC配置;Character Encoding filter; <param-name>contextConfigLocation <param-value>classpath*:applicationContext-*.xml ...
net.example.jaxrs 这些建立可用资源类和方法的注册表: PathInfo ResourceInfo MethodInfo Introspector 匹配算法的实现: RequestMatching RequestMatchingSpec RequestMatchingEnhanced MatchInfo – ...