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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余明辉 中级黑马   /  2012-8-4 09:23  /  1900 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

通过Introspector类的getBeanInfo方法,可以得到一个BeanInfo对象,但是这个对象是个接口对象,而且既然通过BeanInfo对象,还能调用这个接口里面的一些方法,比如getMethodDescriptors() ,getPropertyDescriptors() ,接口里面不都是抽象的、并且没有方法体的方法吗,那调用BeanInfo里面的方法,是怎么调用的?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

5 个回复

倒序浏览
package cn.itcast.day2012o804;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class JavaBeanTest {
        public static void main(String[] args) {
               
                ReflectPointt pt1 = new ReflectPointt(3,5);//实例化对象
                String propertyName = "y";
                Object value = 7;
                setProperty(pt1,propertyName,value);//设置这个设置JavaBean类的y属性
                System.out.println(pt1.getY());//验证setProperty(pt1,propertyName,value)是否设置成功

        }
        
        private static void setProperty(Object pt1, String propertyName,
                        Object value) {               
                try {
        
                        /* 你的问题:
                         * 通过Introspector类的getBeanInfo方法,可以得到一个BeanInfo对象,但是这个对象是个接口对象,
                         * 而且既然通过BeanInfo对象,还能调用这个接口里面的一些方法,比如getMethodDescriptors() ,
                         * getPropertyDescriptors() ,接口里面不都是抽象的、并且没有方法体的方法吗,那调用BeanInfo
                         * 里面的方法,是怎么调用的?
                         *
                         * 回答:BeanInfo是一个接口,但在这里 已经被实现了,用的是多态原理
                         *       如: Set set = new ArryList();
                         *       Set 是一个接口吧 :public interface Set
                         *       但它被实现了,所以就可以那样写了
                         *      
                         */
                        
                        BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
                        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//找到所有符合JavaBean的方法
                        for(PropertyDescriptor pd :pds){
                                if(pd.getName().equals(propertyName)){ //判断是否有 y的方法
                                        pd.getWriteMethod().invoke(pt1,value);//调用getY的方法
                                        break;
                                }
                        }
                } catch (Exception e) {
                        e.printStackTrace();
               }
     }
}

//一个标准的JavaBean类
class ReflectPointt
{
        private int x ;
        private int y ;
        public ReflectPointt(int x, int y) {
                this.x = x;
                this.y = y;
        }
        public int getX() {
                return x;
        }
        public void setX(int x) {
                this.x = x;
        }
        public int getY() {
                return y;
        }
        public void setY(int y) {
                this.y = y;
        }               
}

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
  1. public class Test {
  2. public static void main(String[] args) throws IntrospectionException {
  3. System.out.println(Introspector.getBeanInfo(ArrayList.class).getClass());
  4. }
  5. }
复制代码
用反射返回的是class java.beans.GenericBeanInfo,说明BeanInfo对象接受的是GenericBenInfo这个类,多态的思想
回复 使用道具 举报
杨文宇 发表于 2012-8-4 11:54
用反射返回的是class java.beans.GenericBeanInfo,说明BeanInfo对象接受的是GenericBenInfo这个类,多态的 ...

GenericBeanInfo在API中没有找到这个类啊,难道是内存自动加载的一个类?
回复 使用道具 举报
余明辉 发表于 2012-8-4 23:17
GenericBeanInfo在API中没有找到这个类啊,难道是内存自动加载的一个类?

API我也找不到,你可以到JAVA工程(JRE System Library)的rt.jar包下找java.beans包,能找到
回复 使用道具 举报
谢谢!!问题已解决!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马