天天看点

内省与javaBean

java中的内省

     为了让程序员们更好的操作java对象的属性,sun公司开发了一套api,被业界内称为:内省;内省的出现有利于对类对象属性的操作,减少了代码的数量。下面用一个小例子来印证一下。

     我有一个javabean(关于javabean后面会介绍)类introspector,里面有一个私有的x属性,现在要得到这个x属性的值。如果我们用反射来做的话,首先你要将x字符转为大写的x,然后用字符串拼接成getx,然后你要用反射得到introspector类的class,再得到类的所有公有方法,循环比较方法找出getx方法的method对象,然后用method对象的invoke方法得到x属性的值。这样做还是比较麻烦的。如果用内省来做就会比较简单了,方法如下:

    introspector is1 = new introspector();

    //propertyname:属性名,is1.getclass():包含属性名对象的class(与反射相关)propertydescriptor不明白的可以看jdk帮助文档

    propertydescriptor pd = new propertydescriptor(propertyname,is1.getclass());

    method methodgetx = pd.getreadmethod();

    object getval1 = methodgetx.invoke(is1);//此时的getval1就是属性x的值

    //也可以设置属性的值

    method methodsetx = pd.getwritemethod();

    methodsetx.invoke(is1,3);

    内省访问javabean有两种方法:

        一、通过introspector类获得bean对象的beaninfo,然后通过beaninfo来获取属性的描述器( propertydescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。(这种方法要麻烦一些)

        二、通过propertydescriptor来操作bean对象。(这种方法要简单得多)

    接下来要对student 类对象进行操作,student类源码如下:

public class student {

    private string name;//字段

    public string getxxx(){//读方法

           return "xx";

    }

    public string setxxx(){//写方法

    public string getname() {

           return name;

    public void setname(string name) {

           this.name = name;

}

    首先、是第一种方式,源码如下:

    public void test() throws exception{

           student student = new student();

           //1.通过introspector来获取bean对象的beaninfo

           beaninfo bif = introspector.getbeaninfo(student.class);

           //2.通过beaninfo来获得属性描述器(propertydescriptor)

           propertydescriptor pds[] = bif.getpropertydescriptors();

           //3.通过属性描述器来获得对应的get/set方法

           for(propertydescriptor pd:pds){

                  //4.获得并输出字段的名字

                  system.out.println(pd.getname());

                  //5.获得并输出字段的类型

                  system.out.println(pd.getpropertytype());

                  if(pd.getname().equals("name")){

                         //6.获得propertydescriptor对象的写方法

                         method md = pd.getwritemethod();

                         //7.执行写方法

                         md.invoke(student, "lou_wazor");

                  }

           }

           //8.输出所赋值字段的值

           system.out.println(student.getname());

       }

执行结果为:

class

class java.lang.class

name

class java.lang.string

xxx

lou_wazor

以下是通过第二种方法来操作bean对象,源码如下:

    public void test01()throws exception{

           student st = new student();

           //1.通过构造器来创建propertydescriptor对象

           propertydescriptor pd = new propertydescriptor("name", student.class);

           //2.通过该对象来获得写方法

           method method = pd.getwritemethod();

           //3.执行写方法

           method.invoke(st, "lou_wazor");

           //4.输出对象字段的值

           system.out.println(st.getname());

           //5.通过对象获得读方法

           method = pd.getreadmethod();

           //6.执行读方法并定义变量接受其返回值并强制塑形

           string name = (string) method.invoke(st, null);

           //7.输出塑形后的值

           system.out.println(name);

lou_wazor 

java中的javabean

    一、javabean是什么?

            javabean 是一种java语言写成的可重用组件。为写成javabean,类必须是具体的和公共的,并且具有无参数的构造器。javabean是一种特殊的java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。javabean可分为两种:一种是有用户界面(ui,user interface)的javabean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的javabean。jsp通常访问的是后一种javabean。

/**

 * 一个简单的javabean

 * @author json

 *

 */

public class javabean {

    /**

     * 不写构造函数方法默认提供无参的构造函数方法,如果写了一个有参的构造函数方法,那 就有一个有参的构造函数方法,默认的无参构造函数方法就没有了----这是类的构

     *  造方法的小知识与javabean没有什么关系的

     */

//    public javabean(){

//        

//    }

    //私有属性

    private int x;

    private string y;

     * 得到属性值

     * @return

    public int getx() {

        return x;

    }

     * 设置属性值

     * @param x

    public void setx(int x) {

        this.x = x;

    public string gety() {

        return y;

    public void sety(string y) {

        this.y = y;

    二、用javabean的地方

            如果要在两个模块之间传递多个信息,可以将这些信息封装到一个javabean中,这种javabean的实例对象通常称为值对象(value object, vo),这些信息在类中用私有  字段来存储。javabean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量.如果方法名为setid,中文意思就是设置id,至于你把它存到哪个变量上,不用考虑。如果方法名为getid,中文意思就是得到id,至于你从哪个变量上取,不用考虑。去掉set前缀,剩余部分就是属性名,如果属性的第二个字母是小写的,那首字母小写,属性的第二个字母是大写的,首字母大写,大写是为了好看。

    三、使用javabean要注意的地方

            1.不要试图在javabean返回的html中放置任何字体尺寸。------并不是所有的浏览器都相同。很多浏览器无法处理完整的字体尺寸。

            3.不要提供任何的选择。-----------如果用户使用不同的系统浏览页面,可以提供一种可以替换的方法。(关于这点我是不理解的)

   四、javabean的特点

           1. 可以实现代码的重复利用

           2. 易编写、易维护、易使用

           3. 可以在任何安装了java运行环境的平台上的使用,而不需要重新编译。

   五、javabean遵守的规则

           编写javabean就是编写一个java的类,所以你只要会写类就能编写一个bean,这个类创建的一个对象称做一个bean。为了能让使用这个bean的应用程序构建工具(比如jsp引擎)知道这个bean的属性和方法,只需在类的方法命名上遵守以下规则:

                  getxxx(),用来获取属性xxx。

                  setxxx(),用来修改属性xxx.。

           2. 对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用"is"代替上面的"get"和"set"。

           3. 类中访问属性的方法都必须是public的,一般属性是private的。

           4. 类中如果有构造方法,那么这个构造方法也是public的并且是无参数的。

      关于javabean的更多详细可以去这里看http://baike.baidu.com/link?url=ufk07rhyopk7w34el9wnqca-uw1gtlpg1ledwwuosdxhxrpafgh-wiivwkfpiqfv