java

内省(Introspector)

介绍

内省是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。

JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。

api


  PropertyDescriptor类:

1. getPropertyType(),获得属性的Class对象;
      2. getReadMethod(),获得用于读取属性值的方法;getWriteMethod(),获得用于写入属性值的方法;
      3. hashCode(),获取对象的哈希值;
      4. setReadMethod(Method readMethod),设置用于读取属性值的方法;
      5. setWriteMethod(Method writeMethod),设置用于写入属性值的方法。
      6. getName(),获得该字段的名称;
 

//设置目标对象的对应字段的值(这只是个例子  若需要设置值的话需要判断字段类型的是否匹配)
public static void setProperty(Object source,String property)throws Exception{
        PropertyDescriptor propDesc=new PropertyDescriptor(property,source.class);
        Method methodSetUserName=propDesc.getWriteMethod();
        methodSetUserName.invoke(source, "此处为需要设置进入source的值");
        System.out.println("set userName:"+userInfo.getUserName());
    }
  
//获取目标对象的对应字段的值
public static void getProperty(Object source,String property)throws Exception{
        PropertyDescriptor proDescriptor =new PropertyDescriptor(source,property.class);
        Method methodGetUserName=proDescriptor.getReadMethod();
        Object objUserName=methodGetUserName.invoke(source);
        System.out.println("get property:"+objUserName.toString());
    }

Introspector类:(不建议使用)

都是需要获得PropertyDescriptor,只是方式不一样:PropertyDescriptor通过创建对象直接获得,Introspector需要遍历

package com.peidasoft.Introspector;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;


public class BeanInfoUtil {
        
    public static void setPropertyByIntrospector(Object source,String property)throws Exception{
        BeanInfo beanInfo=Introspector.getBeanInfo(source.class);
        PropertyDescriptor[] proDescrtptors=beanInfo.getPropertyDescriptors();
        if(proDescrtptors!=null&&proDescrtptors.length>0){
            for(PropertyDescriptor propDesc:proDescrtptors){
                if(propDesc.getName().equals(property)){
                    Method methodSetUserName=propDesc.getWriteMethod();
                    methodSetUserName.invoke(source, "需要设置的值");
                    break;
                }
            }
        }
    }
    
    public static void getPropertyByIntrospector(Object source,String property)throws Exception{
        BeanInfo beanInfo=Introspector.getBeanInfo(source.class);
        PropertyDescriptor[] proDescrtptors=beanInfo.getPropertyDescriptors();
        if(proDescrtptors!=null&&proDescrtptors.length>0){
            for(PropertyDescriptor propDesc:proDescrtptors){
                if(propDesc.getName().equals(source)){
                    Method methodGetUserName=propDesc.getReadMethod();
                    Object objUserName=methodGetUserName.invoke(source);
                    System.out.println("get property:"+objUserName.toString());
                    break;
                }
            }
        }
    }
    
}

 

 

 

你可能感兴趣的:(java)