黑马程序员:Java基础总结



JavaBean 内省

 
ASP.Net+Android+IO开发

.Net培训
、期待与您交流!




JavaBean  内省

软件包 java.beans

包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。


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

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


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

一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!好处如下:
在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!

class Bean {
       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;
      }

       private int x ;
       private int y ;

       public Bean(int x, int y) {
             super();
             this.x = x;
             this.y = y;
      }
}

内省
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便。

类:java.beans.PropertyDescriptor
构造方法摘要
PropertyDescriptor(String propertyName, Class<?> beanClass)
          通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。

            Bean bean = new Bean(3, 5);
            String propertyName = "x";
            PropertyDescriptor pd = new PropertyDescriptor(propertyName,
                        bean.getClass());
            Method setX = pd.getWriteMethod();
            setX.invoke(bean, 10);
            System. out.println(bean.getX());

 void setReadMethod(Method readMethod)
          设置应该用于读取属性值的方法。
 void setWriteMethod(Method writeMethod)
          设置应该用于写入属性值的方法。
 Method getReadMethod()
          获得应该用于读取属性值的方法。
 Method getWriteMethod()
          获得应该用于写入属性值的方法。

抽取方法:
       public static void setPro(Object bean, String propertyName, Object setVal)
                   throws Exception {
            PropertyDescriptor pd = new PropertyDescriptor(propertyName,
                        bean.getClass());
            Method setX = pd.getWriteMethod();
            setX.invoke(bean, setVal);
      }


类:java.beans.Introspector(复杂办法,,遍历数组)
static BeanInfo getBeanInfo(Class<?> beanClass)
          在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。
PropertyDescriptor[] getPropertyDescriptors()
          获得 beans PropertyDescriptor

BeanInfo beanInfo =  Introspector.getBeanInfo(pt1.getClass());
            PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
            Object retVal = null;
             for(PropertyDescriptor pd : pds){
                   if(pd.getName().equals(propertyName))
                  {
                        Method methodGetX = pd.getReadMethod();
                        retVal = methodGetX.invoke( pt1);
                         break;
                  }
            }

Beanutils工具包
commons 阿帕奇 javabean 工具包,都是静态方法

用eclipse如何加入jar包:
1:新建文件夹lib
2:把jar包复制进lib里面
3:右键jar包,setpath 让jar变奶瓶

下面加入阿帕奇的两个包beanutils和logging日志开发包

import org.apache.commons.beanutils.BeanUtils;
将值以字符串进行操作
            System. out.println(BeanUtils.getProperty(bean, "x"));
            BeanUtils. setProperty(bean, "x", "11");
import org.apache.commons.beanutils.PropertyUtils ;
将值以原类型的包装类进行操作
            PropertyUtils. setProperty(pt1 , "x" , 9);
            System. out.println(PropertyUtils.getProperty( pt1, "x").getClass().getName());

//java7的新特性
Map map = {name: "zxx",age:18};
BeanUtils.setProperty(map, "name", "lhm" );





 
ASP.Net+Android+IO开发

.Net培训
、期待与您交流!

黑马程序员:Java基础总结----JavaBean 内省的更多相关文章

  1. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)

    正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G  QQ 1481135711 这是我总 ...

  2. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  3. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  4. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  5. 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象

    ------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...

  6. 黑马程序员——JAVA基础之语法、命名规则

    ------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...

  7. 黑马程序员——JAVA基础之File类,递归,打印流,合并切割流

    ------- android培训.java培训.期待与您交流! ---------- File类 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递 ...

  8. 黑马程序员——JAVA基础之多线程的安全问题

    ------- android培训.java培训.期待与您交流! ---------- 导致多线程出现问题的一个特殊的状态:就绪.具备了执行资格,但是还没有获取资源. 导致安全问题的出现的原因: 1. ...

  9. 黑马程序员——JAVA基础之简述设计模式

    ------- android培训.java培训.期待与您交流! ---------- 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓 ...

  10. 黑马程序员——JAVA基础之常用DOS命令和环境变量的配置

    ------- android培训.java培训.期待与您交流! ----------   1.常用dos命令: dir   显示当前文件下目录                             ...

随机推荐

  1. JS实现全选,用于界面批量操作向后台传值时使用

    function seltAll(){ var chckBoxSign = document.getElementById("ckb"); //ckb 全选/反选的选择框id va ...

  2. C语言对mysql数据库的操作

    原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...

  3. 快速构建Windows 8风格应用7-页面视图概览

    原文:快速构建Windows 8风格应用7-页面视图概览 本篇博文主要介绍Windows 8风格应用中包含哪些视图.Visual Studio 2012和模拟器中如何开发和调试不同的页面视图.页面视图 ...

  4. hdu2899 Strange fuction

    在区间(0,100).在恒大二阶导数0.f(x)有极小值.用的最低要求的一阶导数值点: #include<math.h> #include<stdio.h> #include& ...

  5. jquery+ligerform三级联动下拉框

    如下为ligerform里的三级联动下拉框: var formData=[ {display:,width:,space:,type:"select",group:"区域 ...

  6. Java 类的成员初始化顺序

    做个简单笔录,就当是重温下基础知识. 1.先看代码: package com.test; public class Test { public static void main(String[] ar ...

  7. CSS3自适配手机屏幕[转]

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. 3DMax的OFusion插件的使用问题

    使用OFusion将3D max导出到现场Ogre的Mesh该方法是经常使用的非.的一些问题,在这里为方便摘要. 1.OFusion得到: http://download.csdn.net/detai ...

  9. 【C#版本详情回顾】C#2.0主要功能列表

    泛型 优点:类型安全/重用代码/提升性能 应用:泛型接口.泛型类.泛型类型参数.泛型方法.泛型事件和泛型委托 命名空间:System.Collections.Generic 特性:泛型约束,defau ...

  10. 第三方控件netadvantage UltraWebGrid如何生成多级跨行表头个人总结

    1.生成多级表头,横向和纵向跨度. 1>对于有字段的的表头合并:也就是(工期.项目经理信息除外)可以在前台通过spanx和spany属性控制.对于空字段(工资.项目经理必须通过后台动态添加),而 ...