内省访问JavaBean属性的两种方式:
1、通过PropertyDescriptor类操作Bean的属性
2、通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。
案例如下:首先创建一个普通的Java类Student类,该类位于cn.csdn.reflect包中并编译产生相应的class文件.:
public class StudentTest {
@Test
public void test() throws IntrospectionException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
Student st = new Student();
// 1、通过Introspector类获得Bean对象的 BeanInfo,
BeanInfo entity = Introspector.getBeanInfo(Student.class);
// 2、然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor )
PropertyDescriptor pdrs[] = entity.getPropertyDescriptors();
// 3、通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,
for (PropertyDescriptor pd : pdrs) {
// System.out.println(pd.getName());
/*
* System.out.println(pd.getShortDescription());
* System.out.println(pd.getDisplayName());
*/
/* if (pd.getName().equals("age")) {
Method md = pd.getWriteMethod();
md.invoke(st, 12);
}*/
//获取属性的类型
System.out.println(pd.getName()+" "+pd.getPropertyType());
}
// System.out.println(st.getAge());
}
以上那种方法不常用 只做了解就行,下面讲述的方法比较简单,常用
//简便的方法
@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);
}
}
但是Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性——BeanUtiles
Beanutils工具包的常用类:
BeanUtiles、PropertyUtiles、ConvertUtils.regsiter(Converter convert, Class class)、自定义转换public class Demo01 {
/* 采用BeanUtils为Student 的name属性赋值 */
@Test
public void test1() throws Exception {
// 1、加载Class文件
Class cls = 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文件
String className = "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 IllegalAccessException,
InvocationTargetException {
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 = new SimpleDateFormat("yyyy-MM-dd");
//注意MM必须用大写
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()); //toString();
}
}
注意:接口不能new 一个对象,Converter就是一个接口,如果必须要new 一个新的对象的话,必须重写接口中 的方法,相当于 相当于 public class MyConverter implements Converter{ } 并且 创建了MyConveter的对象 new MyConverter()的匿名的对象
相关推荐
总结,本主题主要涉及Java的IOC和AOP概念,以及如何通过内省技术实现类似Spring的功能。通过这个过程,我们可以更深入地理解Spring的工作原理,同时提高我们的编程技巧和解决问题的能力。在源码和工具方面,我们可以...
总结来说,PHP重构和内省工具是提升PHP开发效率、优化代码质量的重要手段。它们通过自动化和智能化的方式,减轻了开发者的工作负担,使代码更易于理解和维护。了解并熟练掌握这些工具,对于任何PHP开发者来说,都是...
### 总结 JavaBean 作为一种标准的组件模型,在 Java 开发中起着重要作用。它不仅有助于提高代码的可维护性和复用性,而且还是许多 Java 框架(如 Spring)的基础。掌握 JavaBean 的编写和使用方法,对于 Java ...
#### 四、总结 反射和内省都是Java中非常强大的特性,能够显著提高程序的灵活性和可扩展性。通过对类和对象的元数据进行操作,这两种技术使得开发者能够在运行时动态地改变程序的行为,这对于构建高度灵活的应用...
总结起来,"【IT十八掌徐培成】Java基础第25天-03.递归获取所有超类-内省获取所有属性-getter-setter.zip"这个课程可能涵盖了如何利用Java的递归技术遍历类的继承树,以及通过内省机制动态访问和修改对象的属性,...
这份"Java基础加强-个人总结doc"文档,结合了张孝祥老师的PPT,为我们提供了全面而深入的学习材料。以下是这份文档可能涵盖的一些核心知识点: 1. **基础知识**:这部分涵盖了Java语言的基础语法,包括变量、数据...
它通过回顾过去,发现和分析问题,从而指导未来的工作,更加注重内省和自我提升。而述职报告的目的则在于对外展示,它不仅是对个人工作能力的展示,更是对组织和上级的一个交代,它是个人职业发展和组织监督评估的...
4. **自我反思与内省**:对于教学效果和学习进步,应经常进行自我反省和总结,寻找改进方法。 5. **独立完成任务**:不论是学生还是教师,诚信和独立完成作业是基本素质,这有助于培养个人责任感和解决问题的能力。 ...
#### 总结 这些内排序算法,包括插入排序、希尔排序、冒泡排序和快速排序,各自有其特点和适用场景。插入排序适用于小规模或基本有序的数据集;希尔排序通过引入增量序列优化了插入排序,提高了效率;冒泡排序虽然...
4. **自我反思与总结**:通过常读书和深思熟虑,教师能够对自己的教学实践进行反思和内省,找出不足并寻求改进策略。同时,学习并提炼同行的成功经验,为教学理论的创新打下基础。 5. **教学质量的保障**:在日常...
曾子提出的内省法,正是这一理念的具体实践,它提醒我们在混乱的时代背景下,更要坚守道德底线,通过自我反省来提升个人品质。 总结来说,《论语》中的这两则名言不仅教导我们要平衡内在品质与外在教养,还强调通过...
1. 构造主义学派:由德国的冯特和铁钦纳为代表,主张通过实验内省法来研究心理内容,即直接体验到的心理元素。冯特于1879年在莱比锡大学建立了第一个心理学实验室,标志着心理学的独立。他们强调心理是由基本元素...
- 它摒弃了内省法,减少了心理学研究中的主观因素,使得研究结果更具科学性。 - 然而,由于忽视了个体内部的心理过程,行为主义学派也受到了批评。 #### 新行为主义学派 - **代表人物**:托尔曼(E.C. Tolman)...
以下是针对辽宁省教师资格证考试中教育心理学部分的知识点总结。 一、心理学流派与代表人物 1. 构造主义心理学:冯特和铁钦纳主张通过内省法研究人的内在心理结构。 2. 技能主义学历学:詹姆斯、杜威和安吉尔关注...
【茶行实习总结】 在2021年的茶行实习经历中,我深入了解到茶行业的独特魅力和丰富内涵。实习期间,我在李记茶行学习并实践,这不仅让我掌握了丰富的茶学理论知识,更重要的是,我体会到了茶行工作中的职业道德与...
【普通心理学精华总结】 普通心理学是研究人类心理现象和行为的科学,主要关注个体的内在心理过程和外在行为表现。以下是对这一领域的核心概念、研究方法及其发展历程的详细阐述。 1. 心理学的研究对象 心理学...
### 总结 以上介绍了四种经典的排序算法:冒泡排序、基数排序、选择排序和插入排序,并通过C++模板函数进行了实现。这四种排序方法各有优缺点,适用于不同的场景。通过比较它们的执行时间,可以进一步了解它们的性能...
这份PPT(幻灯片)旨在总结和解释其中的关键特性。 1. **泛型(Generics)** 泛型允许在类、接口和方法中使用类型参数,提高了代码的类型安全性,避免了运行时类型转换异常。通过泛型,开发者可以编写更具通用性的...
IPython提供了增强的命令行功能,如tab补全、内省(`?`和`??`)、魔术命令(`%`开头的功能)。`%run`命令用于运行Python脚本,`%load`用于加载Notebook中的代码单元,`%paste`和`%cpaste`则用于从剪贴板中运行代码。...
- 结合多元智能,利用肢体语言、角色扮演等方式,让学生在实践中学习,提高他们的内省智能、交际智能和语言智能。 - 教师根据学生特点和教学内容灵活选用教学方法,确保学生在不同教学环节都能积极参与,提高学习...