使用内省的方式操作JavaBean

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 使用内省的方式操作JavaBean
 */
public class IntroSpectorTest {

	public static void main(String[] args) throws Exception {
		ReflectPoint reflectPoint = new ReflectPoint(3,7);

		//调用JavaBean中方法的传统作法
		Class classz = reflectPoint.getClass();
		Field[] fields = classz.getDeclaredFields();
		for (Field field : fields) {
			String name = "set" + field.getName().toUpperCase();
			Method method = classz.getMethod(name, int.class);
			method.invoke(reflectPoint, 3);
		}
		System.out.println(reflectPoint);

		//使用内省的方式调用JavaBean的方法
		String propertyName = "x";
		//获得属性x的值
		Object retVal = getProperty2(reflectPoint, propertyName);
		System.out.println(retVal);
		//设置属性x的值
		setProperty(reflectPoint, propertyName,10);
		System.out.println(reflectPoint.getX());

	}

	/**
	 * 设置属性的值
	 * @param obj 属性所属的对象
	 * @param propertyName 属性名
	 * @param propertyValue 属性值
	 */
	private static void setProperty(Object obj, String propertyName,Object propertyValue) throws Exception {
		PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,obj.getClass());
		Method setMethod = pd2.getWriteMethod();
		setMethod.invoke(obj, propertyValue);
	}

	/**
	 * 获得对象的属性值
	 * @param obj 属性所属的对象
	 * @param propertyName 属性名
	 * @return 属性的值
	 */
	private static Object getProperty(Object obj, String propertyName) throws Exception {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName,obj.getClass());
		Method getMethod = pd.getReadMethod();	//获得get方法
		Object retVal = getMethod.invoke(obj);
		return retVal;
	}

	/**
	 * 使用内省操作javabean
	 * @param obj 属性所属的对象
	 * @param propertyName 属性名
	 * @return 属性的值
	 */
	private static Object getProperty2(Object obj, String propertyName) throws Exception {
		Object retVal = null;
		BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		for (PropertyDescriptor pd : pds) {
			if (pd.getName().equals(propertyName)) {
				Method getMethod = pd.getReadMethod();
				retVal = getMethod.invoke(obj);
				break;
			}
		}
		return retVal;
	}
}
时间: 2024-05-08 10:20:46

使用内省的方式操作JavaBean的相关文章

关于jsp中的useBean指令操作javaBean和通过servlet操作javaBean的一些看法和疑惑

问题描述 在学习jsp和servlet时候,发现在jsp中有一个useBean指令可以操作javaBean中的数据,这让我产生了一些小的疑问,因为根据mvc的模式来看这样似乎将view层和model层直接关联了,不是更应该通过control层从view层中得到数据然后交给model处理相关的逻辑业务吗?如果直接通过jsp中的useBean和通过control层操作model哪个更加符合软件开发的相关需求呢?我们应该使用的是哪种方式操作javaBean更合适呢?求高见...大家也可以一起学习学习呀

BeanUtils工具包操作JavaBean

我们在操作JavaBean的时候 我们可以用Introspector的方式来操作,但是呢这样需要我们写大量的代码 .  Apache小组为我们提供了很有用的工具包来操作JavaBean    也就是BeanUtils工具包 ,这个可以到 apache.org 上面下载 commons-BeanUtils工具包,同时我们也要下载Logging也就是日志工具包 .    我们下载好了BeanUtils工具包之后 打开之后 发现你面有一个docs  那个就是帮助文档 介绍了 Beanutils工具包中

JavaBean内省的简单操作,剖析JavaBean属性设置的原理。。

JavaBean的内省操作 跟反射差不多 ,只是内省操作比反射简单,但是原理都一样, 学会了JavaBean的内省操作 那么对于JavaBean在web中的应用就会有很好的理解,并且明白为什么利用动作指令setProperty就可以设置JavaBean的属性 : 看下面代码 ,有注释. 假设我们有一个JavaBean package me.test; public class IntroSpectorTest    {  private int x ;  public IntroSpectorT

zimbra邮件系统常用的命令行方式操作

zimbra开源邮件系统命令行方式常用的操作 将HTTP登陆方式更改为HTTP\HTTPS登陆方式 $ zmprov ms zimbraMailSSLPort (将HTTPS更改成非443端口) $ zmtlsctl http\https $ tomcat restartsmtp认证错误的解决 zmprov ms `zmhostname` zimbraMtaAuthHost mail.example.com日志服务器错误的解决 $ zmprov getConfig zimbraLogHostna

mvc 中如何使用事务方式操作数据库

问题描述 例如,通过两个实体模型Table_1.Table_2(分别对应于两个表)来同时向两个表插入记录,想要使用事务的方式,即两个插入都必须完成或者都不执行,如下的代码能否实现这种事务操作?或者应该怎么做才能实现事务操作?请高手指点,谢谢!dd.AddToTable_1(newTable_1()//向表1插入一条记录{ID=1,OrderNumer="ss"});dd.AddToTable_2(newTable_2()//向表2插入一条记录{Num=109,Name="ss

VC++中使用ADO方式操作ACCESS数据库

ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API.DAO.RDO都要容易使用,并不失灵活性.本文详细地介绍在Visual C++开发环境下如何使用ADO来进行数据库应用程序开发,并给出示例代码.为了使读者朋友都能测试本例提供的代码,我们采用Access数据库,您可以直接在我们提供的示例代码中找到

网站SEO非正统方式操作让排名不再困难

摘要: 接触seo有一年多,看seo文章不下百篇,绝对多数,占99.99%的文章都在解释传统seo手法,从代码出发,到外链结束.好的文章总结上百条注意事项,烂得文章title,keywords,links几个关键点 接触seo有一年多,看seo文章不下百篇,绝对多数,占99.99%的文章都在解释传统seo手法,从代码出发,到外链结束.好的文章总结上百条注意事项,烂得文章title,keywords,links几个关键点一提就结束.说实话,看的快吐了.直到有天有个人启发了我,seo还有一些非正统方

MySQL for Excel —— 用Excel方式操作MySQL

甲骨文公司的MySQL Windows体验团队今天更新了MySQL for Excel,发布了1.1.1版本. MySQL for Excel是包含在MySQL Installer中的一个工具,允许开发者通过微软的Excel直接操作MySQL数据库,比如: 导出MySQL数据到Excel 导入Excel数据到MySQL现有数据表或新建数据表 直接在Excel中编辑MySQL数据1.1.1版本主要修复了一些bug,详细信息:MySQL for Excel 1.1.1 GA has been rel

黑马程序员 十五、内省:JavaBean、 Beanutils、注解、泛型

Java帮帮-IT资源分享网 内省:JavaBean. Beanutils.注解.泛型  1.内省了解 JavaBean JavaBean 是一种特殊的 Java 类,主要用于传递数据信息,这种 java 类中的方法主要 用于访问私有的字段,且方法名符合某种命名规则. 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个 JavaBean 中,这种 JavaBean 的实例对象通常称之为值对象(Value Object,简称 VO).这些信息在类中用私有 字段来存储,如果读取或设置这些字段