`
he_wen
  • 浏览: 238602 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JavaBean内省的用法

    博客分类:
  • Java
阅读更多

Introspector (Java Platform SE 6)<!-- Generated by javadoc (build 1.6.0-beta2) on Mon Mar 19 18:21:51 CST 2007 --> <script type="text/javascript"> function windowTitle() { if (location.href.indexOf('is-external=true') == -1) { parent.document.title=&quot;Introspector (Java Platform SE 6)&quot;; } } </script>

<noscript></noscript>

一、本文主要是介绍利用Introspector类,如何查找bean相关属性的,和设置属性的方法?

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

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

下面利用代码说明如何用JavaBean的属性利用javaBean内省的功能得到此属性的值?

这个是JavaBean类

package cn.itcast.day1;

import java.util.Date;

public class ReflectPoint {
	private Date birthday = new Date();//注意一定要new一个Date否则会报null异常
	
	private int x;
	public int y;
	public String str1 = "ball";
	public String str2 = "basketball";
	public String str3 = "itcast";
	
	public ReflectPoint(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final ReflectPoint other = (ReflectPoint) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}


	@Override
	public String toString(){
		return str1 + ":" + str2 + ":" + str3;
	}


	public int getX() {
		return x;
	}


	public void setX(int x) {
		this.x = x;
	}


	public int getY() {
		return y;
	}


	public void setY(int y) {
		this.y = y;
	}


	public Date getBirthday() {
		return birthday;
	}


	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	
}

 测试方法类:

getProperty方法,是根据Introspector.getBeanInfo
获取javaBean的所有属性,然后获得的属性与方法传过来的属性字符串遍历判断是否有相等的属性字段名称
如果找到相等的属性字段,就调用方法得到此属性对应的值.
	public class IntroSpectorTest {
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		ReflectPoint pt1 = new ReflectPoint(3,5);
		
		String propertyName = "x";
		//"x"-->"X"-->"getX"-->MethodGetX-->
		Object retVal = getProperty(pt1, propertyName);
		System.out.println(retVal);

               Object value = 7;
		
		setProperties(pt1, propertyName, value);

private static void setProperties(Object pt1, String propertyName,
			Object value) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
		PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass());
		Method methodSetX = pd2.getWriteMethod();
		methodSetX.invoke(pt1,value);
	}
private static Object getProperty(Object pt1, String propertyName)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
        // 这种是简易的方式 
		/*PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
		Method methodGetX = pd.getReadMethod();
		Object retVal = methodGetX.invoke(pt1);*/
                 //下面的方式优点就是如果用户传过来的字符串与javaBean中的属性名称没有一个匹配上的时候,可以用
                 //一个默认的值或者抛出异常
		BeanInfo beanInfo =  Introspector.getBeanInfo(pt1.getClass());
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		Object retVal = null;
		for(PropertyDescriptor pd : pds){
			if(pd.getName().equals(propertyName))
			{
				Method methodGetX = pd.getReadMethod();
				retVal = methodGetX.invoke(pt1);
				break;
			}
		}
		return retVal;
	}
}

 二、下面介绍commons-beanutils  开源的apache基金的工具包?

         java-beanutils.jar工具包还需要与commons-logging.jar配合使用

   可以利用BeanUtils中的getProperty

System.out.println(BeanUtils.getProperty(pt1, "x"));
		BeanUtils.setProperty(pt1, "x", "9");
		System.out.println(pt1.getX());

 如此简单的代码就可以得到javaBean中属性字段的值,还可以设置javaBean中字段的属性值

但是注意BeanUtil设置值以及得到的属性值是用的字符串操作.............

可以利用代码BeanUtils.getProperty(pt1,"x").getClass().getName();查看得到的属性值是什么类型,因此利用工具包

是有利于以后的web开发,因为传到前台页面都是字符串型

BeanUtil类还可以支持javaBean属性之间的级联设置javaBean,比如RefelectPoint类中的Date  birthday属性,又因为Date类中有一个方法getTime

BeanUtils.setProperty(pt1, "birthday.time", "13");
System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));

//java7的新特性
        Map map = {name:"zxx",age:18};
        BeanUtils.setProperty(map, "name", "lhm");
        */

PropertyUtils.setProperty(pt1, "x", 9);
        System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());

0
1
分享到:
评论

相关推荐

    JavaBean及内省文档

    ### JavaBean 及 内省概述 #### 一、JavaBean 概念 ...掌握 JavaBean 的编写和使用方法,对于 Java 开发者来说是非常重要的技能之一。同时,了解内省机制也能帮助开发者更好地利用 JavaBean 进行高级编程任务。

    javabean基础教程

    - **内省(Introspection)**:允许组件揭示其属性和操作,便于其他组件的发现和重用。 - **通信(Communication)**:通过事件机制传递消息,实现组件间的交互。 - **持久性(Persistence)**:保存组件状态,以便在不同...

    minimalcode-reflect:JavaBean 的简约反射和内省功能

    在Java编程语言中,反射和内省是两个强大的特性,它们允许程序在运行时检查类、接口、字段和方法的信息,甚至动态地调用方法和访问属性。"minimalcode-reflect"项目提供了一个简约的框架,专注于JavaBean的反射和...

    JavaBean与反射

    4. **内省支持**:JavaBean必须支持内省(Introspection),这意味着它可以自描述其属性和行为,方便框架和工具进行自动化处理。 5. **可视化工具兼容性**:为了在可视化应用程序生成工具中应用,JavaBean必须符合...

    JavaBean技术PPT学习教案.pptx

    - **内省(Introspection)**:允许组件自省其属性和操作,方便其他组件发现和使用。 - **通信(Communication)**:组件间可以通过事件进行交互。 - **持久性(Persistence)**:保存组件的状态,以便恢复。 - **属性...

    Java内省实例解析

    例如,`PropertyDescriptor`是Java内省API中的一个关键类,它可以用于获取JavaBean的属性描述,进一步获取对应的getter和setter方法。以下是一个简单的示例,展示了如何使用`PropertyDescriptor`来操作`ReflectPoint...

    Java 内省introspector相关原理代码解析

    在Java中,内省主要用于处理JavaBean,即遵循特定规范的类,通常包含get、set方法以及默认构造器。JavaBean类使得数据封装更方便,而内省则提供了动态访问和修改这些数据的能力。 `Introspector` 是Java内省的核心...

    第14章 JavaBeans组件模型.ppt

    JavaBeans组件模型是Java编程中的一种重要概念,它允许开发者创建可重用的软件组件,以提高开发效率和代码的可维护性。...理解和熟练掌握JavaBeans的特性及使用方法,对于Java开发者来说至关重要。

    JavaWeb BeanUtils信息类原理详解

    在本文中,我们将详细介绍 BeanUtils 信息类的原理和使用方法。 一、BeanInfo BeanInfo 是 JavaBean 类的信息类,封装了 JavaBean 对象的信息。每个 JavaBean 对象都对应一个 BeanInfo 对象,我们可以通过 ...

    Java基础加强,成就java高手

    课程涵盖了多个关键知识点,包括Eclipse的使用技巧、静态导入、可变参数、增强for循环、基本数据类型的自动拆箱与装箱、枚举、反射、JavaBean内省、BeanUtils工具包、注解、泛型、类加载器、代理以及线程并发库等。...

    Java基础知识加强PPT

    内省(Introspection)是JavaBean的重要概念,它允许程序在运行时获取和修改JavaBean的属性、事件和方法。`BeanUtils`工具包提供了方便的方法来操作JavaBean。 注解(Annotation)是另一种元数据形式,用于提供有关...

    javaweb文档

    - **上下界限定**:介绍通配符的上下界限定符(extends、super)的使用方法。 #### 1.22 泛型的高级应用 — 有限制的通配符 - **有限制通配符**:探讨如何使用带有类型限制的通配符。 - **示例代码**:给出具体使用...

    方立勋30天轻松掌握JavaWeb视频笔记

    - **BeanUtils工具包**:介绍Apache Commons BeanUtils工具包的使用方法,提高对JavaBean的操作效率。 - **内省应用**:结合具体案例,展示内省技术的实际应用价值。 ##### 9. 泛型技术 - **泛型的作用**:阐述泛型...

    json-lib-2.4&dependencies jars.zip

    4. `commons-beanutils.jar`: Apache Commons BeanUtils库简化了JavaBean操作,通过反射和 introspection(内省)技术,使得操作JavaBean属性更加便捷,这在处理JSON到JavaBean的映射时非常有用。 5. 可能还会有...

    Java基础学习44.pdf

    内省(Introspection)则主要用于JavaBean的属性操作,如`set`和`get`方法,配合`Instrospector`、`BeanInfo`和`PropertyDescriptor`,可以方便地读写JavaBean的属性。此外,了解并熟练运用这些技术,能够有效地提高...

    JavaBeans开发使用手册

    5. **Introspection和Serialization**:JavaBeans提供了内省(Introspection)机制,允许程序在运行时动态检查和修改Bean的属性和方法。而序列化(Serialization)则使得JavaBean可以保存其状态并在稍后恢复。 6. *...

    类的反射机制您的网络连接,请

    通过内省,我们可以查看类的结构,包括包、类型参数、超类、实现的接口、内部类、字段、构造器和方法,甚至在运行时创建对象、修改字段值或调用方法。 2. **Static Introspection**:这是通过`.class`文件来检查类...

    Java基础学习43.pdf

    例如,可以使用反射创建和设置Statement的参数,或者动态调用PreparedStatement的方法。 国庆任务可以围绕以下几个方面进行: 1. 总结Oracle和MySQL数据库的特性和使用技巧。 2. 练习两套SQL题目,加深对SQL语句的...

Global site tag (gtag.js) - Google Analytics