A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 未知数|X| 中级黑马   /  2013-10-20 08:32  /  1021 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 未知数|X| 于 2013-10-20 12:31 编辑

谁知道javabean的内省操作有什么具体作用,搞那么复杂就为了获取方法,我直接调用不就完了

2 个回复

倒序浏览
反射技术实际是已经能够完全满足我们对javaBean的各种操作了,但是为了方便JDK还是为我们提供了一套操纵JavaBean的API,我们称这套API为内省操作(Introspector),下面示范一下通常的两种内省操作.

既然内省是作用于javaBean的,那么我们先提供一个JavaBean类,本例为UserBean.java


[java] view plaincopy
package net.csdn.blog;  
  
public class UserBean {  
  
    private String name;  
    private int age;  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
}  

第一种方法为较繁琐的一种方法,但通常在批量操纵javaBean中的方法时很管用。


[java] view plaincopy
package net.csdn.blog;  
  
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;  
  
public class UserBeanHandlerOne {  
  
    public static void main(String args[]) {  
        UserBean user = new UserBean();  
        try {  
            handleBean(user);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    private static void handleBean(UserBean user)  
            throws IntrospectionException, IllegalArgumentException,  
            IllegalAccessException, InvocationTargetException {  
        BeanInfo bi = Introspector.getBeanInfo(user.getClass());  
        PropertyDescriptor[] pd = bi.getPropertyDescriptors();  
        for (PropertyDescriptor p : pd) {  
            String attrName=p.getName();  
            if(attrName.equals("name")||attrName.equals("age")){  
                Method writeMethod=p.getWriteMethod();//得到set方法  
                Class clazz[]=writeMethod.getParameterTypes();  
                if(clazz[0]==int.class)  
                      writeMethod.invoke(user, 20);  
                else  
                    writeMethod.invoke(user, "peter");//执行set方法  
                Method readMethod = p.getReadMethod();//获取get方法  
                Object obj = readMethod.invoke(user);//执行get方法  
                System.out.println(obj);  
            }  
        }  
    }  
}  

第二种方法是对于某个特定的属性

[java] view plaincopy
package net.csdn.blog;  
  
import java.beans.IntrospectionException;  
import java.beans.PropertyDescriptor;  
import java.lang.reflect.InvocationTargetException;  
import java.lang.reflect.Method;  
  
public class UserBeanHandlerTwo {  
  
      
    public static void main(String args[]) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{  
        UserBean ub=new UserBean();  
        PropertyDescriptor pd=new PropertyDescriptor("name",UserBean.class);  
        Method writeMethod=pd.getWriteMethod();  
        writeMethod.invoke(ub,"peter");  
        Method readMethod=pd.getReadMethod();  
        Object str=readMethod.invoke(ub);  
        System.out.println(str);  
    }  
}  


这两种方法均可以用来作为javaBean的内省操作
回复 使用道具 举报
龏鈊づ廱鵆ぐ 发表于 2013-10-20 11:02
反射技术实际是已经能够完全满足我们对javaBean的各种操作了,但是为了方便JDK还是为我们提供了一套操纵Jav ...

很详细啊,顶一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马