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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姜胜凯 中级黑马   /  2014-1-11 18:56  /  1647 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内省就是javabean类吗?还有就是所谓的set与get方法这么简单吗??
对这不太清楚。求高手指导!

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 淡定

查看全部评分

4 个回复

倒序浏览
以下是我在CSDN博客上看到的
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
内省主要用于对JavaBean进行操作

JavaBean是一个特殊的Java类,其中某些方法符合某种命名的规则
例:int getAge()
    void setAge(int age)  //set,get特定的规则,用于外界的操作
基本格式:

class Person{
    private int x;
    public int getAge(){
       return x;
    }
    public void setAge(int age){
       this.x = age;
    }
}

Person类 里面有 set,get方法,Person类就可以当做JavaBean进行操作,则它里面就有一个Age名称的属性,因为x是私有的,外部只能通过setAge,getAge进行操作。
JavaBean中去掉set,get的方法名,剩下的名称就是JavaBean的属性名,JavaBean的属性名有个规则:如果第二个字母是小的,则把第一个字母变成小的。则上面Person类作为JavaBean的属性为 age。
例:gettime属性为 time;  getTime属性为time;    getCPU 属性为CPU

对JavaBean的简单内省操作


如果一个类符合JavaBean的特点,那它可以当做普通的类来处理,还可以当做JavaBean来处理
例1:使用内省对JavaBean操作
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class ReflectIntroSpector2{
    public static void main(String args[])throws Exception{
       ReflectPoint pt1 = new ReflectPoint(3,5);
      
      //利用JavaBean获取一个值
       String propertyName = "x";
      Object retVal = getProperty(pt1,propertyName);
       System.out.println(retVal);//3
      
      //利用JavaBean设置一个值
       Object value = 7;
       setProperty(pt1,propertyName,value);
       System.out.println(pt1.getX());//7
    }
   
   //重构处理JavaBean的方法
    private static Object getProperty(Object pt1,String propertyName)throws Exception{
      
      //获取传过来对象的传过来的值
       PropertyDescriptor pd = newPropertyDescriptor(propertyName,pt1.getClass());

      //PropertyDescriptor类,属性描述符
       //第一个参数是属性名,第二个参数是要当做JavaBean的类
       Method methodGetX = pd.getReadMethod();

      //获取JavaBean的只读方法,即X属性的读,get方法
       Object retVal = methodGetX.invoke(pt1);

      //第一个参数是指在pt1上面调用,因为调用时get方法不接受参数,所以第二个参数没有
       return retVal;
    }
    private static void setProperty(Object pt1,String propertyName,Object value)throws Exception{
       PropertyDescriptor pd = newPropertyDescriptor(propertyName,pt1.getClass()); //可与上面的共用
       Method methodSetX = pd.getWriteMethod();

      //获取JavaBean的写入方法,即X属性的写,set方法
       methodSetX.invoke(pt1,value);

      //第一个参数是指在pt1上面操作,因为set方法要传递一个参数,第二个参数的是传递个set方法的值value,也就是设置为7,7应该为Integer类型,但1.5有自动打包解包
       //因为set方法无返回值,所以不需要接受
    }
}
class ReflectPoint {
    private int x;
    private int y;
   
    public ReflectPoint(int x,int y){
       super();
       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;
    }
}


对JavaBean的复杂内省操作

IntroSpector类的静态方法getBeanInfo方法,返回BeanInfo对象,就是把这个类当作JavaBean看的结果信息。然后遍历BeanInfo的所有属性方式,查找和设置某个JavaBean对象的属性。
比如有一个集合,可以从集合中查找某个特定的元素
例3:修改上例,使用getBeanInfo方法

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.beans.BeanInfo;
import java.beans.Introspector;
public class ReflectBeanInfo{
    public static void main(String args[])throws Exception{
       ReflectPoint pt1 = new ReflectPoint(3,5);
      
       //利用JavaBean获取一个值
       String propertyName = "x";
      Object retVal = getProperty(pt1, propertyName);
       System.out.println(retVal);//3
      
       //利用JavaBean设置一个值
       Object value = 7;
       setProperty(pt1, propertyName, value);
       System.out.println(pt1.getX());//7
    }
    //重构处理JavaBean的方法
    private static Object getProperty(Object pt1,String propertyName)throws Exception{
      //获取传过来对象的传过来的值
      BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
      //将获取的作为JavaBean类的class文件转为BeanInfo,BeanInfo代表了JavaBean的信息
       PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
       //BeanInfo 只能得到所有的属性描述,不能指定单个的,所以只能放在数组里面
       Object retVal = null;
       for(PropertyDescriptor pd : pds){//对属性数组进行迭代
           if(pd.getName().equals(propertyName)){//将获取每一个属性的名字,与要查找的属性进行比较
              Method methodGetX = pd.getReadMethod();
              retVal = methodGetX.invoke(pt1);
              break;
           }
       }
      return retVal;
    }
    private static void setProperty(Object pt1, String propertyName, Object value)throws Exception{
       BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
       PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
       for(PropertyDescriptor pd : pds){
           if(pd.getName().equals(propertyName)){
              Method methodSetX = pd.getWriteMethod();
              methodSetX.invoke(pt1,7);
              break;
           }
       }
    }
}

评分

参与人数 1黑马币 +3 收起 理由
ily521125 + 3

查看全部评分

回复 使用道具 举报
本帖最后由 高亮亮 于 2014-1-11 20:44 编辑

内省,有他的类,叫Introspector,你可在API里看下.这个类算是一个工具类,大部分为静态方法,为了辅助JavaBean其他各类进行操作的.关于内省操作,一般用的是PropertyDescriptor类中的构造和方法.
之所以JavaBean跟内省联系起来,我是这么理解的.
JavaBean其实不是一个明确的类,他表示的是说一个类,如果你有成员属性,并且为这些成员属性定义了赋值和获取的方法.(set,get,is,等).这样就算是符合了JavaBean的声明类特征,可以通过内省方式来进行赋值.
当然,你肯定这里为什么要有内省,用反射不是可以刻做到这样的事情么?我觉得,首先是为了当成员属性定义的是一个引用类型变量,而这个变量同样可以内省操作,那么这时操作就可以直接一个内省操作结束.便捷很多.如果用反射,我也不多解释,你懂的,代码太麻烦.
还有一点,就是张老师视频里说的用于在框架中使用.具体推荐你仔细看看基础加强视频.
给你我的博客,希望对你有帮助.
http://blog.csdn.net/nottonmyself

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
高亮亮 发表于 2014-1-11 20:41
内省,有他的类,叫Introspector,你可在API里看下.这个类算是一个工具类,大部分为静态方法,为了辅助JavaBean ...

谢谢了。
回复 使用道具 举报
问题解决了请将问题改成已解决哦,保持队形,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马