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);
具体代码比较简单,这里就不贴了。
javabean内省的更多相关文章
- jsp 以及javabean内省技术
l JSP l JavaBean及内省 l EL表达式 1.1 上次课内容回顾 会话技术: Cookie:客户端技术.将数据保存在客户端浏览器上.Cookie是有大小和个数的限制. Session:服 ...
- 黑马程序员:Java基础总结----JavaBean 内省
黑马程序员:Java基础总结 JavaBean 内省 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! JavaBean 内省 软件包 java.beans 包含与开 ...
- Java高新技术 JavaBean内省
Java高新技术 JavaBean内省 知识概要: (1)了解JavaBean内省 (2)JavaBean的简单内省操作 ...
- Spring 属性注入(一)JavaBean 内省机制在 BeanWrapper 中的应用
Spring 属性注入(一)JavaBean 内省机制在 BeanWrapper 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/101174 ...
- JavaBean内省与BeanInfo
Java的BeanInfo在工作中并不怎么用到,我也是在学习spring源码的时候,发现SpringBoot启动时候会设置一个属叫"spring.beaninfo.ignore", ...
- JavaBean 内省API BeanUtils工具 泛型 xml xml约束
1 什么是JavaBean?有何特征? 1)符合特定规则的类 2)JavaBean分二类: a)侠义的JavaBean .私有的字段(Field) .对私 ...
- 内省(Introspector)
/** * 内省:通过反射来操作javabean * 内省类 --> Bean信息 --> 属性描述符 --> 属性的get/set对应的Method --> 进行反射 * c ...
- JavaBeans与内省(Introspector)
JavaBean与Introspector 反射和内省操作很多时候都是在以后要做框架的时候作用非常大. 现在你学的是面向对象编程,即:你所写代码都能够找到对应的类或接口,找到具体的方法写出对应的 ...
- javaee 导航
tomcate端口设定和服务器虚拟目录设定 静态web 应用和动态web应用 tomcat相关问题 web应用 http 响应 url uri 动态页面 servlet 一个简单的servlet的de ...
随机推荐
- boltdb的实现
整个代码不是很复杂,可以从代码中理解如何实现. 特点:btree,很小巧,但实现了完整事务机制,稳定,即使丢电也不会导致数据库错误. 整个结构如下: meta page (前两页) --- > ...
- tomcat、weblogic、jboss的区别,容器的作用
一.tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,它是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心 ...
- 分布式文件系统FastDFS如何做到高可用
FastDFS是用C语言编写的一款开源的轻量级分布式文件系统.它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的 ...
- Coursera课程 Programming Languages, Part B 总结
Programming Languages, Part A Programming Languages, Part B Part A 笔记 碎言碎语 很多没有写过 Lisp 程序的人都会对 Lisp ...
- Smart-image通过SoftReference提高性能
文章导读: 文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人 ...
- 全面总结: Golang 调用 C/C++,例子式教程
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- cs231n spring 2017 lecture16 Adversarial Examples and Adversarial Training 听课笔记
(没太听明白,以后再听) 1. 如何欺骗神经网络? 这部分研究最开始是想探究神经网络到底是如何工作的.结果人们意外的发现,可以只改变原图一点点,人眼根本看不出变化,但是神经网络会给出完全不同的答案.比 ...
- 浅析ASCII、Unicode和UTF-8三种常见字符编码
什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...
- 番外篇--Moddule Zero启动模板
1.3 ABPZero - 启动模板 1.3.1 简介 使用ABP和moudle-zero开始一个新项目的最简单的方式是在模板页创建模板.记住要勾选 Include module zero. 在创建并 ...
- WPF DataTrigger数据触发器
1.通过绑定的属性值变化,动态改变界面的显示,比如绑定了IsExpanded,当为true,grid高度变成600,反之,grid高度变成320. <Grid.Style> <Sty ...