反射内省JaveBean与简单工厂设计模式(六)

2014-11-24 09:39:54 · 作者: · 浏览: 2
-----------------------");
}

}

/**
* 理解,反射作用于数组时内容是采用什么机制的。需要注意JDK1.4与JDK1.5 反射数组的不同。
* @param args
*/
public static void printIntArray(int[] args){
System.out.println("------printIntArray invorked---------");
for(int arg:args){
System.out.println(arg);
}

}

public static void printStringArray(String[] args){
System.out.println("------printStringArray invorked---------");
for(String arg:args){
System.out.println(arg);
}

}

public static void printIntegerArray(Integer... args){
System.out.println("------printIntegerArray invorked---------");
for(Integer arg:args){
System.out.println(arg);
}
}

public int getPos() {
return pos;
}

public void setPos(int pos) {
this.pos = pos;
}

public String getName() {
return name;
}

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

public int getSize() {
return size;
}

public void setSize(int size) {
this.size = size;
}

public ArrayList getAlist() {
return alist;
}

public void setAlist(ArrayList alist) {
this.alist = alist;
}

}
需要注意:反射在调用带数组参数的方法时,一定要注意invork方法调用的情况,因为传入invork方法是一个数组的话,编译器会采用JDK1.4折方法特性将数组拆包,数组中每个元素将作为一个参数传入到相应方法中。这样肯定会与之前的getMethod中的数组.class有冲突,会报java.lang.IllegalArgumentException: wrong number of arguments 参数数量不对了。
为了解决此问题,有两种方法,
一种是不让JDK1.4插手,那么就可将数组前面强转成Object,这样编译器会使用JDK1.5的,不会将数组拆包。如:m1.invoke(rd, (Object)new String[]{"abc","bcd"});
另一种方法是,还是让JDK1.4编,那么外面再用一个数组包起,这个数组。这样JDK1.4遇到这个数组的数组,拆包后还是一样数组正好与getMethod中是一致的。如m1.invoke(rd, new Object[]{new String[]{"abc","bcd"}});
五、内省
内省对应的英文单词为IntroSpector,它主要用于对JavaBean进行操作,JavaBean是一种特殊的Java类,其中的某些方法符合某种命名规则,如果一个Java类中的一些方法符合某种命名规则,则可以把它当作JavaBean来使用。通常的JavaBean是满足有setter与getter方法,且方法名去掉set前缀后,若第二个字母是小写,则属性名为第一个字母小写后的方法名后缀如setXxx 则 属性名为xxx。而若第二个字母也是小写,则属性名是去掉前缀后所有的后缀,如setCPU,则CPU为属性名。这点在后期学习的el表代式都有应用。
操作JavaBean另一个方法的工具包是BeanUtils,它需要loggin包的支持。
BeanUtils 官方下载地址:http://commons.apache.org/beanutils/
Logging 官方下载地址:http://commons.apache.org/logging/
具体示例代码:
[java]
package com.enhance;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

/**
* 内省对应的英文单词为IntroSpector,它主要用于对JavaBean进行操作,JavaBean是一种特殊的Java类,
* 其中的某些方法符合某种命名规则,如果一个Java类中的一些方法符合某种命名规则,则可以把它当作JavaBean来使用。
* 通常的JavaBean是满足有setter与getter方法,且方法名去掉set前缀后,若第二个字母是小写,则属性名为第一个字母小写后的方法名后缀
* 如setXxx 则 属性名为xxx。而若第二个字母也是小写,则属性名是去掉前缀后所有的后缀,如setCPU,则CPU为属性名。这点在后期学习的el表代式都有应用。
*
* */
public class IntroSpectorDemo {

public static void main(String[] args){

ReflectDemo rfd = new ReflectDemo();
rfd.setName("zhangsan");
r