`
jianfulove
  • 浏览: 118434 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
社区版块
存档分类
最新评论

Introspector内省机制

阅读更多

最近忙着开发拎图网图片社区 喜欢的朋友常来逛逛。谢谢.

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 方法.

 

 

2
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics