`
thl1229
  • 浏览: 785 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

通过反射机制为对象属性赋值(转载)

    博客分类:
  • java
阅读更多
package util.core;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**

 * @function:

 * @date : -- 下午0::

 */
@SuppressWarnings("rawtypes")
public class AssignValueForAttributeUtil {
    /** 正则表达式 用于匹配属性的第一个字母 {@value [a-zA-Z]} **/
    private static final String REGEX = "[a-zA-Z]";

    public static void setAttrributeValue(Object obj, String attribute,
        Object value) {
        String method_name = convertToMethodName(attribute, obj.getClass(), true);
        Method[] methods = obj.getClass().getMethods();
        for (Method method : methods) {
            /**
             * 因为这里只是调用bean中属性的set方法,属性名称不能重复
             * 所以set方法也不会重复,所以就直接用方法名称去锁定一个方法
             * (注:在java中,锁定一个方法的条件是方法名及参数)
             * **/
            if (method.getName().equals(method_name)) {
                Class[] parameterC = method.getParameterTypes();
                try {
                    /**如果是基本数据类型时(如int、float、double、byte、char、boolean)
                     * 需要先将Object转换成相应的封装类之后再转换成对应的基本数据类型
                     * 否则会报 ClassCastException**/
                    if (parameterC[0] == int.class) {
                        method.invoke(obj, ((Integer) value).intValue());
                        break;
                    } else if (parameterC[0] == float.class) {
                        method.invoke(obj, ((Float) value).floatValue());
                        break;
                    } else if (parameterC[0] == double.class) {
                        method.invoke(obj, ((Double) value).doubleValue());
                        break;
                    } else if (parameterC[0] == byte.class) {
                        method.invoke(obj, ((Byte) value).byteValue());
                        break;
                    } else if (parameterC[0] == char.class) {
                        method.invoke(obj, ((Character) value).charValue());
                        break;
                    } else if (parameterC[0] == boolean.class) {
                        method.invoke(obj, ((Boolean) value).booleanValue());
                        break;
                    } else {
                        method.invoke(obj, parameterC[0].cast(value));
                        break;
                    }
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static String convertToMethodName(String attribute, Class objClass,
        boolean isSet) {
        /** 通过正则表达式来匹配第一个字符 **/
        Pattern p = Pattern.compile(REGEX);

        Matcher m = p.matcher(attribute);

        StringBuilder sb = new StringBuilder();

        /** 如果是set方法名称 **/
        if (isSet) {
            sb.append("set");
        } else {
            /** get方法名称 **/
            try {
                Field attributeField = objClass.getDeclaredField(attribute);

                /** 如果类型为boolean **/
                if ((attributeField.getType() == boolean.class) ||
                        (attributeField.getType() == Boolean.class)) {
                    sb.append("is");
                } else {
                    sb.append("get");
                }
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }

        /** 针对以下划线开头的属性 **/
        if ((attribute.charAt(0) != '_') && m.find()) {
            sb.append(m.replaceFirst(m.group().toUpperCase()));
        } else {
            sb.append(attribute);
        }

        return sb.toString();
    }

    public static Object getAttrributeValue(Object obj, String attribute) {
        String methodName = convertToMethodName(attribute, obj.getClass(), false);

        Object value = null;

        try {
            /** 由于get方法没有参数且唯一,所以直接通过方法名称锁定方法 **/
            Method methods = obj.getClass().getDeclaredMethod(methodName);

            if (methods != null) {
                value = methods.invoke(obj);
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        return value;
    }
}
分享到:
评论

相关推荐

    通过构造及反射实现类属性赋值

    标题中的“通过构造及反射实现类属性赋值”涉及到的技术是Java的构造函数和反射机制。这两种方法在特定场景下能帮助我们更灵活、更深入地处理对象属性的复制。 首先,构造函数是创建新对象时调用的特殊方法,它可以...

    利用反射机制动态获取对象属性名称及数据类型

    本文将详细讲解如何利用反射机制动态获取对象的属性名称及其数据类型,以C#语言为例,结合ASP.NET环境进行阐述。 首先,我们需要创建一个实体类,例如`Student`,这个类包含了姓名(UserName)、年龄(Age)和地址...

    利用反射给属性赋值

    本篇文章将详细探讨如何利用反射来给对象的属性赋值,以及这个过程中的关键知识点。 一、反射的概念 反射是指在程序运行期间获取并操作类、接口、字段和方法等元数据的能力。通过反射,我们可以在运行时动态地创建...

    Qt 反射机制实现,通过类名创建对象

    反射是指程序在运行时动态获取对象属性与方法的一种机制,即编译器需要将类型信息(属性类型与偏移地址以及成员函数的地址等信息)编译到程序文件中,当程序运行时将这些信息加载到内存中去,做到运行时只根据对象的...

    MyBatis拦截器:给参数对象属性赋值的实例

    在这个特定的实例中,我们讨论的是一个用于给参数对象属性赋值的拦截器。这个拦截器的主要目标是在执行增删改操作时,自动为数据模型对象的特定属性(如创建人、创建时间、修改人、修改时间等)赋值。 在MyBatis中...

    C#数据实体类中如何给属性赋值

    本文将详细介绍如何在C#的数据实体类中为属性赋值,特别是当从数据库中取出的是一个`DataSet`对象时。 #### 实体类定义 首先,我们需要定义一个简单的实体类。在这个例子中,我们定义了一个名为`Class1`的实体类,...

    C#,利用反射动态创建对象

    综上所述,C#的反射机制为开发者提供了在运行时动态操作代码的能力,尤其在处理不确定类型的对象或者需要实现动态行为时,反射成为了一种不可或缺的工具。然而,需要注意的是,由于其内在的性能成本,应当合理地在...

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

    利用反射暴力调用方法 利用反射暴力为属性赋值

    该资源简述了对所有方法进行调用,属性进行赋值.一般情况下private protected 访问修饰符号的方法和属性不能被调用,受到限制.该资源得到了很好的解决!

    java 利用反射机制,获取实体所有属性和方法,并对属性赋值

    通过这样的方式,我们利用Java反射机制实现了对实体类所有属性的遍历,并在遇到null值时为其赋上默认值,从而避免了因null值导致的问题。这种技术在处理动态数据、序列化和反序列化、框架和库的实现等方面非常有用,...

    C#2.0中通过反射功能给类赋值

    - 如果值不为空,使用`PropertyInfo`对象的`SetValue`方法给当前对象的相应属性赋值。`SetValue`方法接受三个参数:要设置的实例、新值和一个可选的索引器数组(在这个例子中,我们传入`null`,因为我们不需要索引...

    C++反射机制实现

    在讨论C++反射机制实现的过程中,我们首先需要明确反射机制的概念和分类。反射的定义源自人工智能领域,它主要涉及到两种反射结构:结构反射和计算反射。结构反射侧重于元类与类之间的关系,计算反射则关注于计算...

    Qt 使用QMetaObject实现反射机制代码demo

    在编程领域,反射机制是一种强大的特性,允许程序在运行时检查自身的行为,包括类的信息、对象的状态以及函数的调用等。在C++的世界里,Qt框架提供了一种实现反射的手段,即QMetaObject系统。这个系统允许我们动态地...

    应用java反射机制打印一个对象.docx

    下面我们将讨论如何使用 Java 反射机制来打印一个对象的所有属性值。 Java 反射机制的概念 Java 反射机制是指 Java 语言中的一种机制,可以在运行时检查和修改对象的行为。反射机制允许程序在运行时检查对象的结构...

    通过类反射机制实现底层数据库连接

    在Java编程中,类反射机制是一种强大的工具,它允许程序在运行时检查并操作类的信息,包括类的方法、属性和构造器。这个机制是Java动态性的重要体现,它使得我们能够在不知道具体类名的情况下,创建对象并调用其方法...

    java面试题--反射机制

    Java反射机制为Java程序提供了一种强大的动态处理能力,使得Java不仅仅局限于静态类型语言的功能限制。掌握Java反射机制对于开发者来说是非常有价值的,尤其是在开发框架、自动化测试等方面的应用。 #### 十、参考...

    反射机制反射Dao 反射机制

    反射机制允许程序在运行时动态地获取类的信息(如类名、方法名、参数类型等),并能动态调用方法或访问和修改对象的属性。这种能力在处理未知类型的数据、实现元编程、插件系统、框架设计等方面有着广泛的应用。 1....

    java反射机制讲解

    Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...

    反射机制和类加载机制学习总结

    2. **代码重用性提高**:反射使得开发者能够通过编写较少的代码来实现更多的功能,尤其是在处理大量类和对象时。 3. **框架与工具支持**:许多现代Java框架(如Spring、Hibernate等)都广泛使用了反射技术,以提供...

Global site tag (gtag.js) - Google Analytics