JAVA基础加强:内省

时间:2021-12-14 15:11:01

                                     


    那么什么是JavaBean呢?JDK中提供了对JavBean进行操作的一些API,这套API就称为内省。

   JavaBean是特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

    如果要在两个模块之间传递多个信息,可以将这写信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。这些方法叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setid,中文译获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则剩余部分的首字母该为小写。

isLast()→last ;getCPU的属性名→CPU

    总之,一个类被当做javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java内部的成员变量。

一个符合JavaBean特点的类可以当做普通类一样进行使用,但作为javaBean有额外的好处。

    呵呵,不知不觉扯多了,闲话不多说,下面用代码举个例子吧:比起打字,我超喜欢代码!

例:

     一个目标类,获取其属性

public class RefelectDemo{

  private int x;

//私有属性,并提供构造方法,set和get 方法

public  RefelectDemo(){}

 putlic RefelectDemo(int x){

  this.x=x;}

  //话说博客里打代码真难受

 public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

//toString方法就不写了

}

//测试类,获取RefelectDemo实例的属性

import java.beans.*;
import java.lang.reflect.*;

//不能忘了导包,一个是Beans,一个关联到了反射

public class IntroSpectorTest {
   public static void main(String[] args)throws Exception {

//有异常,可能没有x这属性
              RefelectDemo rd= new RefelectDemo(3);

   //创建一个RefelectDemo的实例rd,其x的值为3

             PropertyDescriptor pd = new PropertyDescriptor("x",rd.getClass());

//获取x对应的set方法,将其改为7;

                Method methodsetX =pd.getWriteMethod();
                 methodsetX.invoke(rd, 7);

//获取x对应的get方法

                Method methodgetX =pd.getReadMethod();
               System.out.println(methodgetX.invoke(rd));

//结果为7


  BeanInfo beanInfo =Introspector.getBeanInfo(rd.getClass());

 PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();

for(PropertyDescriptor pdt:pds)){
            if(pd1.getName().equals("x")){
                Method method=pd1.getReadMethod();
                retVal= method.invoke(rd);
            }
        }
        System.out.println(retVal);

  }

//可以看出不使用内省的方法是很不方便的。

}