黑马程序员-复习笔记之JavaBean详解

来源:互联网 发布:易语言dnf辅助源码站 编辑:程序博客网 时间:2024/05/22 20:38

------- android培训、java培训、期待与您交流! ----------

package com.itheima;

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

public class JavaBeanReview {

 /**
  * JavaBean是一种特殊的java类,主要用于传递参数信息的,这种java类中的方法主要用于访问私有的字段,且方法
  * 名符合某种规则
  * JavaBean的属性是根据setter和getter方法来确定的,而不是根据其中的成员变量,即有set属性方法和get属性方法
  * ,就可以称之为 JavaBean
  *
  * 如果方法名为setId,中文意思是设置id,至于把他存放到那个变量上,不用管,如果方法名为getId(),中文意思就是设置id
  * 至于把它存放在哪个变量上,也不用管,去掉set前缀,剩余的部分即使属性名,如果剩余部分的第二个字母是小写的,则
  * 吧剩余的首字母改成小写的
  * JavaBean属性名:
  * getTime : time
  * setTime : time
  * getCPU : CPU
  * 总之,一个类被当作JavaBean使用时,JavaBean的属性是根据方法推断出来的,它跟班看不到内部成员变量
  * 一个符合JavaBean特点的类,可以当作普通类一样进行使用,但把它当作JavaBean用肯定会带来一定额外的好处
  * 我们才会去了解使用JavaBean
  *
  * JavaBean的好处:
  * 在JavaEE开发中,经常用到JavaBean,很多环境就要求按照JavaBean方式进行操作,别人都这么用和这么做,所以我们没有选择
  *
  *
  * 一个符合JavaBean特点的类,把它当作JavaBean用,JDK提供了对JavaBean操作的API,这套API称之为内省
  * 如果你自己去通过getX()来访问私有的x.用内省这套API操作JavaBean比普通类的方式更方便
  * 操作方式主要有两种:
  * 1.直接new一个PropertyDescriptor对象的方式,先读取JavaBean的属性
  * 用myeclipse可以将读取属性和设置属性的代码抽象成方法
  * 只要调用这个方法,并传递一个参数对象,属性名和设置值,它就能完成属性修改的功能
  */
 //具体的代码如下
 public static void demo1(){
  Person p1 = new Person("张三",23);
  String propertyName = "name";//获取属性名称
  try {
   //1.创建PropertyDescriptror对象 把要操作的属性以及类的字节码文件传进来
   PropertyDescriptor pd = new PropertyDescriptor("name", p1.getClass());
   //2.通过属性,获取其读取的方法
   Method methodGetName = pd.getReadMethod();
   //3.调用方法
   Object retVal = methodGetName.invoke(p1);//因为不需要参数,所以只把作用的对象传进去
   System.out.println(retVal);//将值进行打印
   
   //二:调用修改属性的方法
   Method methodSetName = pd.getWriteMethod();
   methodSetName.invoke(p1,"李斯");
   //重新获取name的值
   Object newVal = methodGetName.invoke(p1);
   System.out.println(newVal);
   
  } catch (Exception e) {
   // TODO: handle exception
  }
 }
 /*
  * 方法二:在JDK中提供了Introspector类来操作JavaBean.Introspector类中提供了getBeanInfo()静态方法来
  * 获得一个BeanInfo对象,BeanInfo类中提供了相应的方法让我们对JavaBean中的属性进行操作
  * 1.首先通过Instropector.getBeanInfo()获取BeanInfo对象
  * 2.通过BeanInfo.getPropertyDescriptors()获取所有属性的描述
  * 3.通过高级for循环遍历属性并作判断
  * 具体代码如下
  * */
 public static void demo2(){
  Person person = new Person("张三",23);
  String propertyName = "name";
  //1.获取BeanInfo对象
  BeanInfo beanInfo = null;
  try {
   beanInfo = Introspector.getBeanInfo(person.getClass());
  } catch (Exception e) {
   // TODO: handle exception
  }
  //2.获取所有属性的描述
  PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
  //3.对数组进行遍历比较
  for(PropertyDescriptor pd : pds){
   if(pd.getName().equals(propertyName)){
    Method methodGetName = pd.getReadMethod();
    //调用方法
    Object retVal = null;
    try {
     retVal = methodGetName.invoke(person);
    } catch (IllegalArgumentException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IllegalAccessException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (InvocationTargetException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }//因为不需要参数,所以只把作用的对象传进去
    System.out.println(retVal);//将值进行打印
    
    //二:调用修改属性的方法
    Method methodSetName = pd.getWriteMethod();
    try {
     methodSetName.invoke(person,"小刘");
    } catch (IllegalArgumentException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IllegalAccessException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (InvocationTargetException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    //重新获取name的值
    Object newVal = null;
    try {
     newVal = methodGetName.invoke(person);
    } catch (IllegalArgumentException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IllegalAccessException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (InvocationTargetException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    System.out.println(newVal);
   }
  }
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //调用方法,能获取值,也能修改,测试成功
  demo1();
  demo2();
 }

}
//定义一个JavaBean的类
class Person{
 private String name;
 private int age;
 public Person(String name, int age) {
  super();
  this.name = name;
  this.age = 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;
 }
 
}