java的javabean的初步理解

1.首先说下什么是JavaBean?有什么特征?

(1)符合特定规则的类

(2)JavaBean分二类:

1>侠义的JavaBean

.私有的字段(Field)

.对私有字段提供存取方法(读写方法)

2>广义的JavaBean

.私有的字段(Field)

.对私有字段提供存取方法(读写方法)

.数量任意的业务方法

2.内省API(SUN公司开发)

(1)直接调用bean的setXXX或getXXX方法。

通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式。

(2)通过PropertyDescriptor类操作Bean的属性

(3)通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描
述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的
getter/setter 方法,然后通过反射机制来调用这些方法。

3.jdk中的两个重要类PropertyDescriptor和Introspector的介绍(jdk1.6)

(1)PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。

(2)Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。

对于这三种信息,Introspector 将分别分析 bean 的类和超类,寻找显式或隐式信息,使用这些信息构建一个全面描述目标 bean 的 BeanInfo 对象。

对于每个 "Foo" 类,如果存在相应的 "FooBeanInfo" 类,显式信息可能是可用的,查询这些信息时,FooBeanInfo 类会提供一个非 null 值。通过获得目标 bean 类的完全受限定包名称并追加 "BeanInfo" 形成一个新类,首先查找 BeanInfo 类。如果此操作失败,则采用此名称的最终类名称组件,在 BeanInfo 包搜索路径中指定的每个包中搜索该类。

因此对于某个类,比如说 "sun.xyz.OurButton",首先需要查找称为 "sun.xyz.OurButtonBeanInfo" 的 BeanInfo 类,如果失败,则查找 BeanInfo 搜索路径中的每个包来搜索 OurButtonBeanInfo 类。对于默认搜索路径,这意味着将查找 "sun.beans.infos.OurButtonBeanInfo"。

如果某个类提供有关其自身的显式 BeanInfo,则将它添加到从分析所有派生类得到的 BeanInfo 信息中,并将显式信息视为当前类及其基类的确定的信息,无需进一步深入超类链进行分析。

如果没有在某个类上发现显式 BeanInfo,则使用低层次的反射来研究类的方法,并应用标准设计模式来标识属性存储器、事件源或公共方法。然后深入分析类的超类,从它那里(可能在超类链的顶部)添加信息。

因为 Introspector 缓存 BeanInfo 类来获得更好的性能,所以如果在使用多个类加载器的应用程序中使用它,则需小心谨慎。通常,在破坏一个已用于 introspect 类的
ClassLoader 时,应使用 Introspector.flushCaches
Introspector.flushFromCaches 方法从缓存中清除所有内省的类。

4.代码练习

JavaBean类(Student.java):

package cn.wwh.www.java.introspector;

/**

*类的作用:JavaBean

*

*

*@author 一叶扁舟

*@version 1.0

*@创建时间: 2014-7-21   上午10:04:03

*/

public class Student {

private String name;

private int age;

/**

* @return the name

*/

public String getName() {

return name;

}

/**

* @param name the name to set

*/

public void setName(String name) {

this.name = name;

}

/**

* @return the age

*/

public int getAge() {

return age;

}

/**

* @param age the age to set

*/

public void setAge(int age) {

this.age = age;

}

}

测试代码(Demo1.java):

package cn.wwh.www.java.introspector;

import java.beans.BeanInfo;

import java.beans.IntrospectionException;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Constructor;

import java.lang.reflect.Method;

import org.junit.Test;

/**

*类的作用:主要是用来jdk中提供的方法,练习javabean

*

*

*@author 一叶扁舟

*@version 1.0

*@创建时间: 2014-7-21 上午10:04:15

*/

public class Demo1 {

@Test

public void testProperty() throws Exception {

// 通过反射得到对象

Class clazz = Class.forName("cn.wwh.www.java.introspector.Student");

Constructor con = clazz.getConstructor(null);

Student student = (Student) con.newInstance(null);

PropertyDescriptor property = new PropertyDescriptor("name",

Student.class);

property.setName("一叶扁舟");

String name = property.getName();

System.out.println("name:" + name);

// 下面的两步相当于-->student.setName("无悔");

Method method = property.getWriteMethod();

method.invoke(student, "无悔");

// 下面的两步相当于-->student.getName();

Method me = property.getReadMethod();

String nam = (String) me.invoke(student, null);

System.out.println("名字为:" + nam);

// ----------------------------

property = new PropertyDescriptor("age",Student.class);

property.setName("21");

System.out.println("age:--->"+property.getName());

}

@Test

public void testIntrospector() throws Exception{

System.out.println("<----------------------------->testIntrospector()");

BeanInfo beanInfo =
Introspector.getBeanInfo(Student.class);

// 返回一个属性描述的集合

PropertyDescriptor[]  pds = beanInfo.getPropertyDescriptors();

for (PropertyDescriptor propertyDescriptor : pds) {

System.out.println("propertyDescriptor:"+propertyDescriptor.getName());

}

}

}

代码运行效果图:

5.注意:(1)原本Student中的属性只有两个,即name和age,但是输出的结果却是:
age,class,name,三个属性,这主要是因为,java中所有类的父类都是Object,其中Object
中的隐含着一个属性class,所以输出时也将这个隐含属性也输出来了。

(2)如果将Student中的属性全部删除,并且去掉set方法,调用testIntrospector()方法

得到的仍然是age,name,class三个属性,即对javaBean操作时,属性和getXxxxx()有
关,同时必须有返回值。(实际代码的测试结果)

时间: 2024-10-26 15:44:00

java的javabean的初步理解的相关文章

Spring学习笔记--环境搭建和初步理解IOC

Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hibernate等其他众多的框架. 下面介绍环境的搭建,首先下载好spring的完整包,我下载的是4.2.5版本的,在elipse中,新建java项目: 1,导入核心jar包: 2.在src目录下,创建spring配置文件(名称可以自定义,一般写为beans.xml): <?xml version="1.

初步理解socket

近期研究下socket,发现自己还是有非常多不明确的地方,索性沉下心来,从最基础開始学习,開始看起,如今对自己的学习做下小小总结,以便和大家分享,如有谬误,敬请指正. 原创文章,转载请注明出处:http://blog.csdn.net/jessonlv TCP/IP 在学习socket之前,先回想下TCP/IP协议. TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机怎样连入因特网及数据怎样再它们之间

node.js module初步理解,exports与module.exports的区别

在开发一个复杂的应用程序的时候,我们需要把各个功能拆分.封装到不同的文件,在需要的时候引用该文件.没人会写一个几万行代码的文件,这样在可读性.复用性和维护性上都很差,几乎所有的编程语言都有自己的模块组织方式,比如Java中的包.C#中的程序集等,node.js使用模块和包来组织,其机制实现参照了CommonJS标准,虽未完全遵守,但差距不大,使用起来非常简单. 在node.js中模块与文件是一一对应的,也就是说一个node.js文件就是一个模块,文件内容可能是我们封装好的一些JavaScript

初步理解@Transactional注解

在SSM项目中,经常在业务层的类或者方法上看到@Transactional注解,只是知道这个注解的作用是进行事务管理,但是具体有哪些属性,在什么情况下进行回滚,确是不那么清楚.所以在网上看了一些视频和博客,初步理解了Spring的事务管理.这里记录的主要是一些概念,如果想要能快速学会使用和理解事务管理,建议去相关视频.我看的是https://www.imooc.com/learn/478. 一.要理解Spring的事务管理,首先要了解什么是事务,事务有哪些特性,不遵守这些特性会出现什么问题.只有

对于中国剩余定理(CRT)的初步理解

以前觉得用中国剩余定理来求同余方程组很鸡肋,因为可以用拓展欧几里得算法来构造出一种更加强大(可以处理取模的数(默认为mi)不互质的情况)的算法. 今天查了点资料,发现我太天真了. 首先讲讲中国剩余定理: 即 : x ≡ a[i] (mod m[i]) 1<= i <= r (m[i] 两两互质) 求这个同余方程组可以快速算: x = ∑M/m[i] * Inv(M/m[i], m[i]) * a[i] (mod M) 其中M = m[1]*m[2]*m[3]...m[r]  , Inv(x,

CSS (一)初步理解

通过牛腩新闻发布系统,接触了CSS,也感受到了它在做Web前台开发时简单方便易更改的优点. 尤其是后边对于CSS盒子的学习和认识,更加让人体会到网页设计和很多事物一样蕴含着深刻的思想和设计技巧,融于生活,表现生活. 本篇文章主要是对CSS内容概况的一些个人理解. CSS,即级联样式表.它真正做到了使网页表现层与内容分离的一种样式设计语言,做到了代码控制界面,简单易修改的解耦效果. 通过CSS,我们可以精确控制对象位置精确到像素级,还可以随心设计对象样式和风格,达到最优的美观度. 下面是CSS的一

CSS初步理解

最近在学习牛腩的时候遇到了网页的制作,挺新鲜的.当中涉及到了有关CSS的知识,于是乎自己也就花费两个小时的时间,找了本浅显易懂的书来看了一遍,从宏观上来了解CSS的相关内容.有关CSS的基础知识详见下链接. CSS基础知识 以下是对CSS理解的导图 通过上图我们也发现,CSS也很难,也容易.容易是说,学起来很快就可以上手,这中语言简单易懂,只要你具备小学英语的知识量就可以了.困难是在指学好它并不容易,因为它需要你耐心.就好比我们对word文档的排版,哪里需要主体鲜明一点,哪里需要着重突出一下,哪

java提高篇(四)_理解java的三大特性之多态 转自 http://cmsblogs.com

多态就是指程序中定义 的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该 引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让 引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个 运行状态,这就是多态性 一. 向上转型

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可