//testpropertyUtils. java import org.apache..commons.beanutils.*; import junit .framewor" name="description" />

数据库中数据项变化不定,如何设计Java Beans(4)

发表于:2007-07-14来源:作者:点击数: 标签:
数据库 中数据项变化不定,如何设计Java Beans(4) · 3.2.2 使用propertyUtils实用类访问扩展属性 下面propertyUtils以五中格式访问扩展属性的代码: CC CCCC">//testpropertyUtils. java import org.apache..commons.beanutils.*; import junit .framewor
数据库中数据项变化不定,如何设计Java Beans(4)

· 3.2.2 使用propertyUtils实用类访问扩展属性

   下面propertyUtils以五中格式访问扩展属性的代码:

CCCCCC">//testpropertyUtils.java
import org.apache..commons.beanutils.*;

import junit.framework.TestCase;
import junit.framework.Test;
import junit.framework.TestSuite;

public class testpropertyUtils extends TestCase {
public propertyUtilsTestCase(String name) {
super(name);
}
/**
* 实例化TestBean
*/
public void setUp() {
bean = new TestBean();
}
/**
* 测试索引属性
*/
public void testSetIndexedValues() {
Object value = null;
//测试数组索引属性
try {
propertyUtils.setproperty(bean,
"dupproperty(0)",
"New 0");
value =
propertyUtils.getproperty(bean,
"dupproperty(0) ");
assertNotNull("Returned new value 0", value);
assertTrue("Returned String new value 0",
value instanceof String);
assertEquals("Returned correct new value 0", "New 0",
(String) value);
} catch (Throwable t) {
fail("Threw " + t);
}
//测试List索引属性
try {
propertyUtils.setproperty(bean,
"listIndexed(0) " ,
"New value");
value =
propertyUtils.getproperty(bean,
" listIndexed(0)");
assertNotNull("Returned new value 0", value);
assertTrue("Returned String new value 0",
value instanceof String);
assertEquals("Returned correct new value 0", " New value ",
(String) value);
} catch (Throwable t) {
fail("Threw " + t);
}
}
/**
* 测试映射属性
*/
public void testSetMappedValues() {

Object value = null;
try {
propertyUtils.setproperty(bean,
"hash(key1)",
"New 0");
value =
propertyUtils.getproperty(bean,
"hash(key1)");
assertNotNull("Returned new value 0", value);
assertTrue("Returned String new value 0",
value instanceof String);
assertEquals("Returned correct new value 0", "New 0",
(String) value);
} catch (Throwable t) {
fail("Threw " + t);
}
}
/**
* 测试嵌套属性
*/
public void testNestedValues() {
….
}
}


· 4、动态bean

   相对标准Java Bean的编译时静态决定一个Bean的属性,利用扩展javaBean属性机制,能在运行时决定属性的bean为动态bean。动态bean既有标准Java Bean的类型检查机制又有扩展javaBean属性机制的动态特点。下面我们从创建动态Bean和在配置文件中定义动态Bean的属性两方面介绍common-beanutils中动态bean机制。

· 4.1 运行时创建动态bean

   动态bean具有动态属性,也就是说可以由程序运行时构造bean的属性,而不是像标准的javaBean在编译时决定一个bean的属性。

   定义和访问一个动态bean的步骤如下:

   a 定义一个动态属性Dynaproperty数组,动态属性Dynaproperty定义了一个属性的名字和对象类型;

   b 用定义好的动态属性数组实例化一个动态类;

   c 由动态类返回一个动态bean;

   d 可以用propertyUtils访问和设置动态bean的属性。

   下面是定义和访问动态bean的代码

//TestBean.java
import java.util.*;
import java.io.*;
public class TestBean {
private String dupproperty[] =
{ "Dup 0", "Dup 1", "Dup 2", "Dup 3", "Dup 4" };
//propertyUtils只需要该索引属性的一个获取器操作就能
//使用get/setIndexedproperty方法访问和设置索引和元素值
public String[] getDupproperty() {
System.out.println("getDupproperty");
return (this.dupproperty);
}
//下面的方法对propertyUtils的get/setIndexedproperty方法不关键,有则会调用这些方法
public String getDupproperty(int index) {
System.out.println("getDupproperty index");
return (this.dupproperty[index]);
}

public void setDupproperty(int index, String value) {
System.out.println("setDupproperty index value");

this.dupproperty[index] = value;
}

public void setDupproperty(String dupproperty[]) {
System.out.println("setDupproperty du[]");
this.dupproperty = dupproperty;
}
//这是一个索引属性,除了支持"[]"型的数组属性外,还支持申明为List类型的属性
/**
* A List property aclearcase/" target="_blank" >ccessed as an indexed property.
*/
private static List listIndexed = new ArrayList();

static {
listIndexed.add("String 0");
listIndexed.add("String 1");
listIndexed.add("String 2");
listIndexed.add("String 3");
listIndexed.add("String 4");
}

public List getListIndexed() {
return (listIndexed);
}

//嵌套属性
private TestBean nested = null;
public TestBean getNested() {
System.out.println("getNested");
if (nested == null)
nested = new TestBean();
return (nested);
}

//这是一个映射属性,必须申明为Map类型,propertyUtils只需要该属性的一个获取器操作就能
//使用get/setMappedproperty方法访问和设置键和值
private Map hash = null;
public Map getHash(){
System.out.println("getHash");
if (hash == null) {
hash = new HashMap();
hash.put("First Key", "First Value");
hash.put("Second Key", "Second Value");
}
return (hash);
}
//下面的方法对在common-beanutils 1.6.1中propertyUtils
  的getMappedproperty方法不起作用,中不调用这些方法,
//而且不支持嵌套的映射属性
//propertyUtils.setMappedproperty(bean,
  "nested.hash(Fifth Key)", "Fifth Value"); don't work!!

public Object getHash(String Key){
System.out.println("getHash Key");
return hash.get(Key);
}

public void setHash(String Key,Object value){
System.out.println("setHash Key value ");
hash.put(Key,value);
}
//这是一个简单属性,想在propertyUtils中修改必须有设置器操作
private String sample = null;
public String getSample() {
return sample;
}
public void setSample(String sample){
this.sample = sample;
}
}


· 关于作者

   龚永生,对java技术,Linux技术以及项目管理非常感兴趣。您可以通过gongys@legend.com与他联系。

原文转自:http://www.ltesting.net