内省与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(){//写方法
           return "xx";
    }
    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

class java.lang.String

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

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中放置任何字体尺寸。------并不是所有的浏览器都相同。很多浏览器无法处理完整的字体尺寸。

            2.不要试图在JavaBean返回的HTML中放置任何脚本或者DHTML。------向页面直接输出脚本或者DHTML相当于自我毁灭,因为某些浏览器版本在处理不正确的脚本时会崩溃(非常少但是有)。如果用户的JavaBean在运行时是动态的推出复杂的HTML语言,用户将陷入调试的噩梦。另外,复杂的HTML将限制JavaBean的寿命和灵活性。

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

   四、JavaBean的特点

           按着Sun公司的定义,JavaBean是一个可重复使用的软件组件。实际上JavaBean是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean。由于javabean是基于java语言的,因此javabean不依赖平台,具有以下特点:

           1. 可以实现代码的重复利用
           2. 易编写、易维护、易使用
           3. 可以在任何安装了Java运行环境的平台上的使用,而不需要重新编译。
   五、JavaBean遵守的规则

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

           1. 如果类的成员变量的名字是xxx,那么为了更改或获取成员变量的值,即更改或获取属性,在类中可以使用两个方法:

                  getXxx(),用来获取属性xxx。
                  setXxx(),用来修改属性xxx.。
           2. 对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用"is"代替上面的"get"和"set"。
           3. 类中访问属性的方法都必须是public的,一般属性是private的。
           4. 类中如果有构造方法,那么这个构造方法也是public的并且是无参数的。

      关于JavaBean的更多详细可以去这里看http://baike.baidu.com/link?url=ufk07RHyoPK7W34El9WNQcA-UW1GtlpG1LedwwUoSdXHXrPaFgH-wiIvWKFPIqfv

相关文章
|
1天前
|
Java 数据库
JAVA对象和类
JAVA对象和类
5 0
|
1月前
|
存储 Java 对象存储
Java对象和类
Java对象和类
15 1
|
7月前
|
Java
JavaBean学习小结
JavaBean学习小结
24 0
|
8月前
|
设计模式 缓存 Java
Java反射(反射与代理设计模式、反射与Annotation、自定义Annotation、反射整合工厂设计模式和代理设计模式)
1.反射与代理设计模式,2.反射与Annotation,3.自定义Annotation,4.Annotation整合工厂设计模式和代理设计模式
45 0
|
存储 Java Spring
Spring框架中注入集合对象
你好看官,里面请!今天笔者讲的是在Spring框架中关于注入集合对象的用法(有示例!全网最详细!!) 不懂可以在评论区留言,我看到会及时回复。 注意:本文仅用与学习参考,不可用于商业用途。
785 3
Spring框架中注入集合对象
|
Java 编译器 应用服务中间件
关于JavaBean你了解多少~(2)
关于JavaBean你了解多少~(2)
|
设计模式 Java
关于JavaBean你了解多少~
关于JavaBean你了解多少~
|
Java API
关于JavaBean你了解多少~(3)
关于JavaBean你了解多少~(3)
|
存储 Java
javaBean内省类【javaBean、BeanInfo、Introspector、PropertyDescriptor】
javaBean内省类【javaBean、BeanInfo、Introspector、PropertyDescriptor】
176 0
javaBean内省类【javaBean、BeanInfo、Introspector、PropertyDescriptor】
|
Java
Cglib应用:基于Map动态生成JavaBean对象
再某些特殊的场景下,存在手动创建java类的case,比如我有个需求,希望根据简单的Map对象,来生成一个对应的Java bean,可以怎么整? 针对这个而典型的场景,先考虑是否有现成可用的开源工具类来实现,比如我们经常接触到cglib,它可以动态生成代理对象,那么生成Java Bean也没有什么问题 接下来我们看一下使用cglib来创建bean的方式
718 0

热门文章

最新文章