内省的简单介绍
来源:互联网 发布:音乐后期软件 编辑:程序博客网 时间:2024/05/23 18:31
内省(Introspector)
开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。
内省访问JavaBean属性的两种方式:
第一种:
通过PropertyDescriptor类操作Bean的属性
通过Introspector类获得Bean对象的 BeanInfo,
然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),
通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,
然后通过反射机制来调用这些方法。
例:
Student sd=new Student();
BeanInfo bif=Introspector.getBeanInfo(Student.class);
PropertyDescriptor pdrs[]=bif.getPropertyDescriptors();
for (PropertyDescriptor pd : pdrs) {
if (pd.getName().equals("age")) {
Method md = pd.getWriteMethod();
md.invoke(sd, 12);
}
}
//简便的方法
@Test
public void test1()throws Exception{
Student st = new Student();
//通过构造器 创建 PropertyDescriptor对象
PropertyDescriptor pd = new PropertyDescriptor("age", Student.class);
Method md = pd.getWriteMethod(); //写操作
md.invoke(st, 120);
System.out.println(st.getAge());
md = pd.getReadMethod();
int value = (Integer)md.invoke(st, null); //读操作
System.out.println(value);
第二种:beanutils工具包
Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性--BeanUtils
Beanutils工具包的常用类:
– BeanUtils
– PropertyUtils
– ConvertUtils.regsiter(Converter convert, Class clazz)
– 自定义转换器
例:采用BeanUtils为Student类的name属性赋值
@Test
public void test1() throws Exception {
// 1、加载Class文件
Classcls = Class.forName("cn.csdn.beanutils.Student");
// 2、创建bean对象
Student bean = (Student) cls.newInstance();
// 3、采用BeanUtils对name属性赋值
BeanUtils.setProperty(bean, "name", "xxx");
String value = BeanUtils.getProperty(bean, "name");
System.out.println(value);
}
例:Beanutils支持基本数据类型的自动转换
@Test
public void test2() throws Exception {
// 1、定义class文件
Stringclass Name="cn.csdn.beanutils.Student";
// 2、定义操作的属性
String name = "age";
// 3、创建class对象
Class cls = Class.forName(className);
// 4、创建bean对象
Student bean = (Student) cls.newInstance();
// 5、为操作的bean对象的name属性赋值
BeanUtils.setProperty(bean, name, "200");
// 6、执行输出
System.out.println(bean.getAge());
}
@Test
public void test3() throws Exception{
Student st = new Student();
BeanUtils.setProperty(st, "name", "redarmy"); // 避免了基本的数据类型转换的问题
System.out.println(st.getName());
}
@Test
public void test4() throws Exception {
Student bean = new Student();
BeanUtils.setProperty(bean, "birthday", new Date());
System.out.println(bean.getBirthday());
}
自定义转换器
例:
@Test
public void test5() throws Exception {
Student bean = new Student();
// 自带的转换器
ConvertUtils.register(new DateLocaleConverter(),Date.class);
BeanUtils.setProperty(bean,"birthday", "1997-12-12");
System.out.println(bean.getBirthday());
}
@Test
public void test6() throws Exception {
Student bean = new Student();
//自定义转换器
ConvertUtils.register(new Converter() {
// 转换的类型 //转换的值
public Object convert(Class type, Object value) {
if (value == null) {
return null;
}
SimpleDateFormat sdi=newSimpleDateFormat("yyyy-MM-dd");
Date dt = null;
try {
dt = sdi.parse((String) value);
} catch (ParseException e) {
throw new ConversionException("日期格式转换有问题....");
}
return dt;
}
}, Date.class);
BeanUtils.setProperty(bean,"birthday", "1997-11-12");
System.out.println(bean.getBirthday());
}
注意:
Converter接口 Android new Converter(){ //重写接口中的方法 }
相当于 public class MyConverter implements Converter{ //重写接口中的方法
} 并且 创建了MyConveter的对象 new MyConverter();//匿名的对象
- 内省的简单介绍
- JavaBean的简单内省操作
- 对javabean的简单内省和复杂内省操作
- JavaBean的简单内省操作 以及复杂内省操作
- Objective-C的内省方法介绍
- 有关javaBean的简单内省操作
- Java 对JavaBean的简单内省操作
- 黑马程序员-javaBean的简单内省操作
- 对javaBean简单的内省操作
- java内省机制介绍
- 黑马程序员:内省(IntroSpector)与JavaBean的介绍
- Java基础--对javaBean的简单内省操作
- JAVA基础加强之对javaBean的内省简单操作
- 通过PropertyDescriptor和Introspector对JavaBean的简单内省操作
- java中内省简单使用
- javaBean的内省机制
- 内省的使用
- java的内省机制
- 日期类加减及Java中日期类操作算法大全 (转)
- 临界区对象
- 互锁函数
- 仿Google分页的经典案例
- 泛型的简单介绍
- 内省的简单介绍
- 成功科学家如何读文献
- 反射简单介绍
- 一年三篇IF大于7的经验之谈
- gcc编译各个阶段以及各个阶段的作用
- 枚举类的简单介绍
- ARM汇编指令集
- 编译器编译之后的目标文件结构
- 转载的笔记(反射)