Java反射机制深度解析与应用示例

4星 · 超过85%的资源 需积分: 50 9 下载量 138 浏览量 更新于2024-09-17 收藏 2KB TXT 举报
"此资源主要介绍了Java反射机制的应用,包括如何检查类、创建对象、访问方法和字段,以及在实际开发中的几个应用场景,如表单数据填充、动态调用方法、优化性能等。" Java反射机制是Java编程语言的一个强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。以下将详细阐述标题和描述中提到的知识点: 1. **检查类(Class对象)** - `Class.forName("com.jdk")`:通过全限定类名获取`Class`对象,这里表示的是`com.jdk`类。 - `isInstance()`:检查给定的对象是否是由这个`Class`对象所表示的类或接口实例。例如,`cls.isInstance(new jdk())`判断传入的新建`jdk`对象是否是`cls`类的实例。 2. **创建对象(newInstance())** - `newInstance()`:通过`Class`对象创建一个该类的新实例。例如,`jdk jdkobj = cls.newInstance();`创建了一个`cls`类的新对象`jdkobj`。 3. **访问方法(Method对象)** - `getDeclaredMethods()`:返回一个包含类所有声明的方法(包括私有方法)的数组。 - `getDeclaredFields()`:返回一个包含类所有声明的字段(包括私有字段)的数组。 4. **调用方法(invoke())** - `invoke(Object obj, Object... args)`:通过`Method`对象调用指定对象上的方法。例如,`methods.invoke(jdkobj, null)`执行`methods`数组中某个方法,参数为`null`。 接下来,我们看看在实际开发中如何应用反射机制: a. **表单数据填充** - 在处理表单数据时,可以先创建一个对应的Java Bean类,然后利用反射将表单中的数据填充到Bean中。例如,使用Apache Commons的`BeanUtils`库的`populate()`方法。 b. **动态调用方法** - 当需要在运行时根据条件调用不同方法时,反射可以派上用场。例如,在Struts框架中,`messageResources`的初始化可能会根据配置动态加载相应的工厂类并实例化。 c. **性能优化** - 反射通常比直接调用方法慢,但如果需要在大量数据处理时动态访问属性,可以预热(提前加载并缓存)反射相关对象,以减少后续的反射操作时间。例如,对于131个属性的记录,可以创建一个Bean类并使用反射一次性填充所有属性,而非逐个设置。 d. **数据库查询与结果集映射** - 当数据库查询返回的列数不固定时,可以使用反射动态创建Bean并映射结果集。这使得SQL查询和Bean属性之间可以灵活对应,避免硬编码,同时可以适应多变的数据结构。 Java反射机制提供了对类、对象、方法和字段的动态访问能力,使得在编程中可以实现更灵活的控制和更高的代码复用性。然而,由于反射的性能开销,应当谨慎使用,特别是在对性能敏感的场景下。
2008-09-23 上传
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用MyEclipse 5.5完成demo示例。其中,com.jb.arklis.app.DemoApplication类利用反射技术可以观察任何非静态类(比如java.lang.String, javax.swing.JFrame等类和自定义的类,比如com.jb.arklis.dao.BaseDAO)的普通方法、构造方法以公有属性,是一个非常有实用意义的显示类。 该示例没有使用泛型技术,所以不是很完美。不过只要你稍微修改一下,就可作为自己工程中比较好的封装工具类使用! 下载解压之后,使用MyEclipse 5.5导入,打开该工程,找到DemoApplication类,然后点击run菜单-->找到(x)Arguments,然后在Program arguments中输入: com.jb.arklis.dao.BaseDAO, 然后点击run按钮,如果一切正常,那么你会看到使用反射在DemoApplication类中呼叫了BaseDAO的returnTestValue(String name)方法。 我的代码注释非常详细,相信当你看完之后,一般来说,如果不是新手(非常菜的人),那么你应该学会使用反射技术来实现封装的动作了--也就是说,你的技术有了一个非常大的提高--如果你看完之后,参见该示例中另外的JDBC代码,然后能够实现对JDBC进一步的封装,使JDBC连接的使用步骤更简单的话! OK,Good luck!