7.内省(Introspector)和Javabean
开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射过于麻烦,sun公司开发了一套API,专门用于操作java对象的属性用户属性封装到javabean中
字段对外提供get set方法成为属性 属性由get set决定
每个javabean继承Object, Object自带getClass()属性
BeanInfo info = Introspector.getBeanInfo(Person.class,Object.class);
//将Person类属性内省到BeanInfo对象(Person类去除父类Object类的属性)
PropertyDescriptor[] pds = info.getPropertyDescriptors();
//获得属性描述器
for(PropertyDescriptor pd : pds){
System.out.printIn(pd.getName());
//获得所有属性名
}
PropertyDescriptor pd = new PropertyDescriptor(“age”,Person.class);
//描述Person类指定的age属性
Method method = pd.getWriteMethod();
Method.invoke(p,45); // 实现setAge()方法
System.out.printIn(p.getAge()); //可以获得age为45
Method = pd.getReadMethod();
System.out.printIn(method.invoke(p,null)); //实现getAge()方法
pd.getPropertyType() 获得属性的类型
使用内省api(beanUtils框架)操作javabean的属性
BeanUtils.setProperty(对象,属性名,配置文件中读取的字符串值)
将对象属性数据封装到对象中
BeanUtils可以将String内部转为需要的8种基本数据类型
如果要转为Date类型这种非基本数据类型,给BeanUtils注册一个Date转换器
ConvertUtils.register(converter,Date.class)
converter是接口,在其中要实现其抽象方法来new实例
BeanUtils.populate(bean,map)
用map集合中的值填充bean的属性 map的key值要和属性名相同
8.泛型(Generic)
泛型允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行是可能发生的问题,转变为编译时的问题,以此提高程序的可读性和稳定性(大型程序中尤为突出)
掌握泛型的基本使用
a)掌握泛型集合的存取
List<String> list = new ArrayList<String>();
list.add(“aa”);
list.add(“bb”);
list.add(“cc”);
//传统方法
Iterator<String> it = list.iterator(); //创建迭代器来取
While(it.hasNext()){
String value = it.next();
System.out.printIn(value);
}
//增强for循环方法
for(String s : list){
System.out.printIn(s);
}
Map<Integer,String> map = new LinkedHashMap<Integer,String>();
map.put(1,”aa”);
map.put(2,”bb”);
map.put(3,”cc”);
//传统keyset,entryset方法
Set<Map,Entry<Integer,String>> set = map.entrySet();
Iterator<Map,Entry<Integer,String>> it = set.iterator();
while(it.hasNext()){
Map.Entry<Integer,String> entry = it.next();
int key = entry.getKey();
String value = entry.getValue();
System.out.printIn(key+”=”+value);
}
//增强for循环方法(重点掌握)
for(Map.Entry<Integer,String> entry : map.entrySet()){
int key = entry.getKey();
String value = entry.getValue();
System.out.printIn(key+”=”+value);
}
b)泛型的几个注意事项
使用泛型时,泛型类型必须为应用类型,不能是基本数据类型List<String> list = new ArrayList<String>();
两边泛型类型要一样
List<String> list = new ArrayList();
List list = new ArrayList<String> ();
只有一边都没错 照顾兼容性
泛型是提供给javac编译器使用的,用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据,但编译生成的class文件不再带有泛型信息,从而不影响程序运行效率,这个过程称为 ”擦除”
c)泛型的基本术语
以ArrayList<E>为例<>读作typeof
E称为类型参数变量
ArrayList<Integer>中Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
给E赋值 ArrayList<Integer>称为 参数化的类型ParameterizedType
自定义带泛型的方法
public <T> T a(T t){
//返回T类型(被传入参数确定),不用强制转型
}
public <T,E,K> void b(T t,E e,K k){
//多类型参数
}
自定义类上的泛型
类上声明的泛型类型,类中非静态方法可以使用
例子:编写一个泛型方法,接受一个任意数组,并逆序所有元素
Public <T> void reverse(T arr[]){
int start = 0;
int end = arr.length-1;
while(true){
if(start >= end){
break;
}
T temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}