`
yjafd
  • 浏览: 20827 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

用反射实现bean的包装

    博客分类:
  • JAVA
阅读更多

做j2ee的朋友,我都听说过aop,ioc等概念。其实他们都可以称为j2ee的一种设计模式。
其中核心的技术使用java语言中的reflect(反射)机制。用过spring的人都会想怎么实现这中ioc容器,进行管理bean呢?先了解一下反射。
java发射机制,实际是给应用提供一个自审的机制。可以通过应用来获得运行起对象的各种属性和行为。这很重要,正是因为有了这个,才可以动态的注入运行期动态对象的属性数据。下面是我在实现一个一个java对象的一个包装。主要用来解决属性的检查和数据的获取,以简化其访问的方式。
/*
* Created on 2005-9-19
*
* http://www.soosoo.com.cn
* Copyright (C) 2005 Version
*/
package com.paic.paonline.award.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Category;

/**
* @author ex_wangjianhua
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class BeanRefecter {
private Category log=Category.getInstance(this.getClass());
public List getNotNullFields(Object param){
Class cs=param.getClass();
Field[] f=cs.getDeclaredFields();
List list=new ArrayList();
try {
for(int i=0;i Field fd=f[i];
Object obj=this.invokeGetMethod(fd,param);
if(obj!=null){
list.add(fd);
}
}
return list;
} catch (IllegalArgumentException e) {
log.error("error get fields arr for msg"+e.getMessage());
return null;
}
}
public String getNotNullFieldsStr(Object param){
Class cs=param.getClass();
Field[] f=cs.getDeclaredFields();
StringBuffer buf=new StringBuffer();
try {
for(int i=0;i Field fd=f[i];
Object obj=this.invokeGetMethod(fd,param);
if(obj!=null){
buf.append(fd.getName()+",");
}
}
if(buf.length()>0)
buf.deleteCharAt(buf.length()-1);
return buf.toString();
} catch (IllegalArgumentException e) {
log.error("error get fields str for msg"+e.getMessage());
return null;
}
}
public String getNotNullParamStr(Object param){
Class cs=param.getClass();
Field[] f=cs.getDeclaredFields();
StringBuffer buf=new StringBuffer();
try {
for(int i=0;i Field fd=f[i];
Object obj=this.invokeGetMethod(fd,param);
if(obj!=null){
buf.append("?"+",");
}
}
if(buf.length()>0)
buf.deleteCharAt(buf.length()-1);
return buf.toString();
} catch (IllegalArgumentException e) {
log.error("error get param str for msg"+e.getMessage());
return null;
}
}

public Object getFieldValue(Field f,Object bean){
try {
return f.get(bean);
} catch (IllegalArgumentException e) {
return null;
} catch (IllegalAccessException e) {
return null;
}
}
public Object invokeGetMethod(Field f,Object param){
String fName=f.getName();
StringBuffer buf=new StringBuffer();
buf.append("get");
buf.append(fName.substring(0,1).toUpperCase());
buf.append(fName.substring(1));
String mName=buf.toString();
try {
Method method=param.getClass().getDeclaredMethod(mName,null);
return method.invoke(param,null);
} catch (SecurityException e) {
return null;
} catch (NoSuchMethodException e) {
return null;
} catch (IllegalArgumentException e) {
return null;
} catch (IllegalAccessException e) {
return null;
} catch (InvocationTargetException e) {
return null;
}
}
//call bean set method
public void invokeSetMethod(Field f,Object param,Object value) throws Exception{
String fName=f.getName();
StringBuffer buf=new StringBuffer();
buf.append("set");
buf.append(fName.substring(0,1).toUpperCase());
buf.append(fName.substring(1));
String mName=buf.toString();
Class [] pm=new Class [1];
pm[0]=f.getType();
Object[] in=new Object[1];
in[0]=value;
Method method=param.getClass().getDeclaredMethod(mName,pm);
method.invoke(param,in);
}
public void invokeSetMethod(String fName,Object param,Object value) throws Exception{
StringBuffer buf=new StringBuffer();
buf.append("set");
buf.append(fName.substring(0,1).toUpperCase());
buf.append(fName.substring(1));
String mName=buf.toString();
Field f=param.getClass().getDeclaredField(fName);
Class [] pm=new Class [1];
pm[0]=f.getType();
Object[] in=new Object[1];
in[0]=value;
Method method=param.getClass().getDeclaredMethod(mName,pm);
method.invoke(param,in);
}
}
有了这个类。就可以动态的获取任何javaBean对象的数据,而不用知道他的具体定义.大家可以想象一下
想ibatis这种sql mapping的工具,对java对象到数据表的映射实现了.通过xml文件可以获得bean的属性到字段的定义。通过属性就可以完成java对象到数据库记录的相互转化。

分享到:
评论

相关推荐

    Spring bean对象实例化实现过程图解

    这个方法的主要作用是把 bean 实例化,并且包装成 BeanWrapper。这个方法是反射调用类中的 factoryMethod 方法。需要注意的是@Bean 方法的原理,实际上 Spring 会扫描有@Bean 注解的方法,然后把方法名称设置到 Bean...

    Java开发学习(四)----bean的三种实例化方式.doc

    5. **访问私有构造函数**:将构造函数改为私有,程序仍然能够正常运行,这意味着Spring通过反射机制可以访问到私有构造函数,从而创建Bean。 6. **带参数的构造函数**:尝试将构造函数改为接受一个参数,运行程序时...

    java反射机制简介

    - **框架实现**:Spring框架中的Bean管理依赖反射来创建和管理Bean。 - **单元测试**:JUnit等单元测试工具利用反射进行测试案例的执行。 - **插件架构**:利用反射加载插件,使得系统具有更好的扩展性。 #### 九、...

    commons-beanutils-1.7.0-src.zip

    源码阅读时,我们不仅可以了解BeanUtils的基本工作流程,还可以学习到设计模式的应用,如工厂模式(用于创建Converter实例)、装饰器模式(用于增强方法的行为)以及反射和代理技术的使用。此外,通过对异常处理的...

    2022年品味Spring 的魅力Java教程.docx

    它是一个接口,用于包装任何Java Bean,并提供对其属性和方法的访问。在Spring的实现中,`BeanWrapperImpl`是BeanWrapper的主要实现类,它负责处理Bean的属性设置和方法调用。通过BeanWrapper,开发者可以方便地操作...

    BeanUtil框架完整包

    4. **反射操作**:BeanUtils库利用Java反射API,使得开发者无需直接编写反射代码,就能执行基于属性名的方法调用。 5. **处理集合和数组**:对于Bean中包含集合或数组的属性,BeanUtils也提供了相应的处理方法,...

    commons-beanutils-1.8.0的jar包(全).rar

    通过`BeanUtils.setProperty()`和`BeanUtils.getProperty()`方法,我们可以无需关心属性的getter和setter方法的具体实现,直接对bean的属性进行操作。 2. **类型转换**:BeanUtils自动处理基本数据类型与包装类型...

    Commons BeanUtils包说明

    - **异常处理**:在处理Bean操作时,BeanUtils会捕获并包装可能抛出的异常,如`InvocationTargetException`和`NoSuchMethodException`,提供更友好的错误信息。 3. **IOTest.java和Test2.java中的应用示例** 这两...

    spring AOP 基础

    - Proxy(代理):AOP框架使用代理对象来包装目标对象,从而实现切面的拦截与通知的织入。 在实现AOP的时候,常用的代理模式有三种: - 静态代理:在代码编译阶段,由程序员手工或自动编写代理类,为特定的目标对象...

    16.spring与springmvc常见面试题.docx

    答:简单工厂、工厂方法、单例模式、适配器、包装器、代理、观察者、策略、模板方法 6. Spring 的优点 答:1.降低了组件之间的耦合性,实现了软件各层之间的解耦;2.可以使用容易提供的众多服务,如事务管理,消息...

    J2EE面试集

    - `java.lang.Double`:不可以实例化(F),应该使用其包装类型或基本类型。 - `java.lang.Math`:不可以实例化(F),它是一个工具类,提供了数学运算的方法,但不能实例化。 - `java.lang.Void`:不可以实例化(F...

    fhir-java:HL7 FHIR Java 实现

    5. **未装箱基本类型**:了解 Java 原始数据类型和包装器类的区别,以及在性能敏感的场景中如何选择使用。 6. **Maven**:如果项目使用 Maven,学习如何阅读和使用 `pom.xml` 文件进行项目构建和依赖管理。 7. **...

    基础篇.pdf

    【基础篇.pdf】这篇文档主要涵盖了Java编程语言的基础知识,包括面向对象编程、设计原则、类和对象、数据类型、字符串、集合框架、并发、枚举、IO以及反射等内容。 面向对象是Java的核心特性,它有三个基本特征:...

    java开发常用的jar包的作用解释.pdf

    commons-beanutils.jar 提供了对 Java 反射和自省 API 的包装,主要提供了对于 JavaBean 进行各种操作,例如获取 bean 的属性、设置 bean 的属性、将 bean 转换为其他类型等等。 3. commons-digester.jar commons-...

    java程序员面试题(银河创想).pdf,这是一份不错的文件

    8. Java反射机制底层实现:Java反射是通过Class类和java.lang.reflect包中的API实现的。它允许在运行时检查类的信息(如方法、字段),并能动态调用方法和访问字段。底层实现涉及字节码解析和JNI,与JVM紧密相关。 ...

    java和j2ee面试题集(经典)

    - **基础**: EJB(Enterprise JavaBeans)基于Java EE标准,利用了Java的反射、代理等技术。 - **组件**: 包括Session Bean和Entity Bean等。 **2. SessionBean与EntityBean的区别** - **SessionBean**: 用于管理...

    beanutils-1.8.3开发包

    Apache BeanUtils库是Java开发中的...不过,由于BeanUtils使用反射,可能存在一定的性能损耗,因此在性能敏感的应用中需要谨慎使用。同时,由于其依赖于JavaBeans规范,对于非JavaBeans对象的操作可能需要额外的适配。

    JavaSE 笔记(基础我介绍)

    内省是Java提供的一种机制,用于获取对象的属性、方法信息,常用于Bean对象的操作,例如通过反射获取和设置属性值。 8. 类加载器: 类加载器负责将类的.class文件加载到JVM中,理解双亲委托模型有助于理解类的...

    java面试讲题汇总-word可打印版

    51. Java 8的ConcurrentHashMap弃用分段锁是因为分段锁在多核CPU环境下性能瓶颈,改为使用CAS和Node链表实现。 52. ConcurrentHashMap使用synchronized而非ReentrantLock是因为减少锁粒度,提高并发性能。 53. ...

Global site tag (gtag.js) - Google Analytics