☆☆☆★☆☆☆

唯有努力才能活成自己想要活成的样子

导航

java的反射Method

开发过程中有时会使用到动态生成一个class,记录下,方便后面开发直接参考

1.在一个bean类中通过反射动态获取调用setter和getter方法(bean中添加下面四个方法)

/**
*获取类的方法
*/
public static Method getGetOrSetMethod(Object obj, String fieldName, Boolean isGetMethod, Class<?> fieldType) throws SecurityException, NoSuchMethodException{
        Method method=null;
        String methodName;
        if(isGetMethod != null && isGetMethod){
            methodName = "get";
        }else{
            methodName = "set";
        }
        if(DataUtil.isUppercaseLetter(fieldName, 1)){
            methodName += fieldName;
        }else{
            methodName += fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
        }

        if(fieldType != null){
            method = obj.getClass().getDeclaredMethod(methodName, fieldType);
        }else{
            method = obj.getClass().getDeclaredMethod(methodName);
        }
        return method;
    }
/**
*给字段设值
*/

public static void setFieldValue(Object obj, String fieldName, Object value, Class<?> fieldType) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException{
        Method setMethod = getGetOrSetMethod(obj, fieldName, null, fieldType);
        if(fieldType != value.getClass()){    //value的类型和set方法中的参数类型不一致的时候
            if(fieldType == Double.class){    //Object-->Double
                value = getDoubleValue(value);
            }
        }
        setMethod.invoke(obj, value);
    }
/**
*获取字段的值
*/
public static Object getFiledValue(Object obj, String fieldName) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException{
        Object result=null;
        Method getMethod = getGetOrSetMethod(obj, fieldName, true, null);
        if(getMethod != null){
            result = getMethod.invoke(obj);
        }
        return result;
    }
/**
*获取字段的值
*/
public Object getDeclaredField(String name){
        Object obj=null;
        try {
            obj=类名.class.getDeclaredField(name).get(this);
        } catch (Exception e) {}
        return obj;
    }

/**
* 获取Double型数据
* */
public static Double getDoubleValue(Object obj){
Double value = null;
if(obj != null){
if(obj.getClass() == Double.class){
value=(Double)obj;
}else if(obj.getClass() == Long.class){
value = ((Long)obj).doubleValue();
}else if(obj.getClass() == Integer.class){
value = ((Integer)obj).doubleValue();
}
}
return value;
}
 

2.使用cglib工具包动态生成bean

给出一个demo

mvn依赖:

<dependency>
     <groupId>cglib</groupId>
     <artifactId>cglib</artifactId>
     <version>2.2.2</version>
</dependency>            

公共bean类

public class CreatedBean {
    //Bean实体Object
    public Object object = null;
    //属性map
    public BeanMap beanMap = null;

    public CreatedBean() {
        super();
    }
@SuppressWarnings(
"unchecked") public CreatedBean(Map<String, Class> propertyMap) { //用一组属性生成实体Bean this.object = generateBean(propertyMap); //用实体Bean创建BeanMap,以便可以设置和获取Bean属性的值 this.beanMap = BeanMap.create(this.object); } /** * 给bean中的属性赋值 * * @param property 属性名 * @param value 值 */ public void setValue(String property, Object value) { beanMap.put(property, value); } /** * 获取bean中属性的值 * * @param property 属性名 * @return*/ public Object getValue(String property) { return beanMap.get(property); } /** * 得到该实体bean对象 * * @return */ public Object getObject() { return this.object; } @SuppressWarnings("unchecked") private Object generateBean(Map<String, Class> propertyMap) { //根据一组属性名和属性值的类型,动态创建Bean对象 BeanGenerator generator = new BeanGenerator(); Set keySet = propertyMap.keySet(); for (Iterator i = keySet.iterator(); i.hasNext();) { String key = (String) i.next(); generator.addProperty(key, (Class) propertyMap.get(key)); } return generator.create(); //创建Bean } }

测试调用公共bean

 public static void main(String[] args) throws Exception {
        HashMap<String, Class> propertyMap = new HashMap<String, Class>();
        propertyMap.put("id", Class.forName("java.lang.Integer"));
        propertyMap.put("name", Class.forName("java.lang.String"));
        propertyMap.put("address", Class.forName("java.lang.String")); // 生成动态Bean
        propertyMap.put("date", Class.forName("java.sql.Date"));
        CreatedBean bean = new CreatedBean(propertyMap);
        // 给Bean设置值
        bean.setValue("id", 123);  //Auto-boxing
        bean.setValue("name", "454");
        bean.setValue("address", "789");

        // 获得bean的实体
        Object object = bean.getObject();
        // 通过反射查看所有方法名
        Class clazz = object.getClass();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method curMethod : methods) {
            System.out.println(curMethod.getName());
        }
        System.out.println(" >> id = " + bean.getValue("id"));
        System.out.println(" >> name = " + bean.getValue("name"));
        System.out.println(" >> address = " + bean.getValue("address"));
    }

 

posted on 2020-04-20 16:55  Yr-Zhang  阅读(784)  评论(0编辑  收藏  举报