javabean内省

  • 何为JavaBean?

JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 属性。

 用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。 有的时候我们也成javabean是什么VO了,什么BTO了,什么polo了,说的都是一个东西

  • JavaBean分类:

JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。

  • JavaBean规范:

1,JavaBean 类必须是一个公共类,并将其访问属性设置为 public  ,如: public class user{......}

2,JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器

3,一个javaBean类不应有公共实例变量,类变量都为private  ,如: private int id;

4属性应该通过一组存取方法(getXxx 和 setXxx)来访问,一般是IDE(Eclipse、JBuilder) 为属性生成getter/setter 方法

注意:一般JavaBean属性以小写字母开头,驼峰命名格式,相应的 getter/setter 方法是 get/set 接上首字母大写的属性名。例如:属性名为userName,其对应的getter/setter 方法是 getUserName/setUserName。以后在定义个javabean的时候,一定要注意检查属性的大小写,特别是第一个字母。如果首字母大写,也是属性名直接用作 getter/setter 方法中 get/set 的后部分。例如属性名为Name,方法是getName/setName,这样子会找不到属性出错,或者说不存在那个属性,因为默认的属性名是name。

  • 内省是什么?

通过反射的方式访问javabean的技术,我们可以去实现一种通用性。java中也有实现,不过一般不用,那几个类看上去有点繁琐,Jdk中有个api : PropertyDescriptor类,他可以操作Bean和Beaninfo的属性。

1.传统的方式去访问javabean

package linkin;

public class LinkinTest
{
	public static void main(String[] args)
	{
		Linkin linkin = new Linkin();
		linkin.setName("LinkinPark...");
		linkin.setAge(25);
		System.out.println(linkin);
	}

}

class Linkin
{
	private String name;
	private Integer age;

	public Linkin()
	{

	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public Integer getAge()
	{
		return age;
	}

	public void setAge(Integer age)
	{
		this.age = age;
	}

	@Override
	public String toString()
	{
		return "Linkin [name=" + name + ", age=" + age + "]";
	}

}

2.使用内省的方式来访问javabean

package linkin;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

public class LinkinTest
{
	public static void main(String[] args) throws Exception
	{
		Linkin linkin = new Linkin();
		//创建属性描述器
		PropertyDescriptor descriptor = new PropertyDescriptor("name", Linkin.class);
		//获得写方法
		Method writeMethod = descriptor.getWriteMethod();
		//调用写方法
		writeMethod.invoke(linkin, "LinkinPark...");
		System.out.println(linkin);
	}

}

class Linkin
{
	private String name;
	private Integer age;

	public Linkin()
	{

	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public Integer getAge()
	{
		return age;
	}

	public void setAge(Integer age)
	{
		this.age = age;
	}

	@Override
	public String toString()
	{
		return "Linkin [name=" + name + ", age=" + age + "]";
	}

}

3.简化书写,实现通用性。这里写一个通用的方法,让属性名称为一个变量,假如属性名很多的话,得到属性名后,就可以遍历,然后给他们一一的赋值,这就是内省的魅力。

如果不用反射,那么传统的方式是不可能实现通用的。

下面代码实现能够为任何的javabean赋任何的值,只有用内省的方法才可以做的到:

package linkin;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

public class LinkinTest
{
	public static void main(String[] args) throws Exception
	{
		Linkin linkin = new Linkin();
		setProperty(linkin, "name", "LinkinPark...");
		setProperty(linkin, "age", 25);
		System.out.println(linkin);
	}

	// 实现一个通用的方法   为任意的一个javabean的任意属性赋任意值
	public static void setProperty(Object bean, String fieldName, Object value) throws Exception
	{
		// 创建属性描述器
		PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass());

		// 获得 写方法
		Method writeMethod = descriptor.getWriteMethod();

		// 调用 写方法
		writeMethod.invoke(bean, value);
	}
}

class Linkin
{
	private String name;
	private Integer age;

	public Linkin()
	{

	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public Integer getAge()
	{
		return age;
	}

	public void setAge(Integer age)
	{
		this.age = age;
	}

	@Override
	public String toString()
	{
		return "Linkin [name=" + name + ", age=" + age + "]";
	}

}

BeanUtils工具包,上面的代码有点底层的,Apache的commons包里面定义了一个这个工具类,里面有这个方法的。

setProperty(bean, name, value),我们在使用这个方法的时候不需要强制属性的类型,他会按照我们定义javabean的时候的类型帮我们放进去的,所以传入的是就传入字符串作为value就可以了。

使用这个方法我们可以将任何request提交的表单封装到对应的javabean。

先获得所有的参数:

Enumeration names = request.getParameterNames();

循环获得里面的每一个参数:

String value = request.getParameter(name);

传入一个类名,跑下反射,获得一个实例:

Object bean=beanClass.newInstance();

使用beanUtils将属性注入到对象中:

BeanUtils.setProperty(bean, name, value);

具体代码比较简单,这里就不贴了。

时间: 2024-10-29 09:05:38

javabean内省的相关文章

jsp 以及javabean内省技术

l JSP l JavaBean及内省 l EL表达式 1.1 上次课内容回顾 会话技术: Cookie:客户端技术.将数据保存在客户端浏览器上.Cookie是有大小和个数的限制. Session:服务器端技术.将数据保存在服务器端.Session没有大小和个数限制.Session基于Cookie回写了一个JSESSIONID. Cookie的分类: * 会话级别的Cookie:浏览器关闭了,Cookie就销毁了! * 持久化的Cookie: * cookie.setMaxAge(时间); --

JavaBeans与内省(Introspector)

JavaBean与Introspector 反射和内省操作很多时候都是在以后要做框架的时候作用非常大.    现在你学的是面向对象编程,即:你所写代码都能够找到对应的类或接口,找到具体的方法写出对应的代码.    但是以后学面向抽象编程的时候,即:我们所写的代码完全抽象,比如我们写的框架所要面向的类或方法目前并没有的,而是以后别人用我们的框架写出来的类.但是我们又怎么调用去他们的类get/set方法呢?所以这个时候要用到反射和内省进行抽象编程. /* JavaBean与内省(Introspect

JDK1.5的新特性(1)

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

黑马程序员——JAVA学习笔记十二(高新技术一)

 1,    静态导入: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.solaire.enhance; import static java.lang.Math.max;  //import   语句可以导入一个类或某个包中的所有类 //import static  静态导入 JDK5以后才有.语句导入一个类中的某个静态方法或所有静态方法 //无名包和有包名中的类在一起,没有package,则为无名包. //一个类

request与response对象.

request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在我们Servlet中使用的request与response HttpServletRequest接口------>父接口  ServletRequest HttpServletResponse接口----->父接口  ServletResponse 在tomcat中它采用门面模式对requst,r

黑马程序员_Java高新技术

1  JDK5的新特性 1.1 静态导入       在API中那些不需要new对象的类,可以在类文件的开头,import static java.lang.Math.*;这里把Math中的所有的静态方法都导入了,在类中不需要调用Math类就能直接用Math的方法了 package cn.wjd.staticimport; import static java.lang.Math.*; public class StaticImport { public static void main(Str

黑马程序员——基础加强篇

------- android培训.java培训.期待与您交流! ---------- MyEclipse相关知识 Workspace与project 切换工作空间:File---Switch Workspace---Other 一个工作间包含多个工程,切换工作间之后,会影响里面的工程,例如快捷键什么的都要重新配置如果重新配了之后快捷键还没有用就要考虑下那个快捷键是不是冲突了    视图管理与程序调试 可以通过Window---Show View来添加各种透视图. 调试程序的时候可以在代码右边双

Spring IoC 依赖注入(二)源码分析

目录 Spring IoC 依赖注入(二)源码分析 1. 依赖注入口 - populateBean 1.1 doCreateBean 1.2 populateBean 2. 手动注入 2.1 相关的类说明 2.2 applyPropertyValues 2.3 BeanDefinitionValueResolver 2.4 依赖检查 2. 自动注入 2.1 那些字段会自动注入 2.2 名称注入 2.3 类型注入 Spring IoC 依赖注入(二)源码分析 本章主要分析 Spring IoC 依

JAVA中反射机制五(JavaBean的内省与BeanUtils库)

内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”.方法比较少.这些信息储存在类的私有变量中,通过set().get()获得. 例如类UserInfo : package com.peidasoft.in