`

反射机访问属性值的代码

 
阅读更多

我们完全可以通过反射机制来修改一个对象的私有变量的值,由于该文章并不是讨论反射的的文章,所以这里只给出通过反射来修改私有变量值的代码,但并不作详细的说明:

我们创建一个新的类,叫BeanUtils.java

类得内容看其来如下:


public class BeanUtils {

 

 

    private BeanUtils() {

    }

 

 

    /**

     * 直接设置对象属性值,无视private/protected修饰符,不经过setter函数.

     */

    public static void setFieldValue(final Object object, final String fieldName, final Object value) {

        Field field = getDeclaredField(object, fieldName);

 

        if (field == null)

            throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");

 

        makeAccessible(field);

 

        try {

            field.set(object, value);

        } catch (IllegalAccessException e) {

        Log.e("zbkc", "", e);

        }

    }

 

    /**

     * 循环向上转型,获取对象的DeclaredField.

     */

    protected static Field getDeclaredField(final Object object, final String fieldName) {

        return getDeclaredField(object.getClass(), fieldName);

    }

 

    /**

     * 循环向上转型,获取类的DeclaredField.

     */

    @SuppressWarnings("unchecked")

    protected static Field getDeclaredField(final Class clazz, final String fieldName) {

        for (Class superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {

            try {

                return superClass.getDeclaredField(fieldName);

            } catch (NoSuchFieldException e) {

                // Field不在当前类定义,继续向上转型

            }

        }

        return null;

    }

 

    /**

     * 强制转换fileld可访问.

     */

    protected static void makeAccessible(Field field) {

        if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) {

            field.setAccessible(true);

        }

    }

}


该工具提供一个共有的方法:public static void setFieldValue(final Object object, final String fieldName, final Object value)来修改一个对象的私有变量的值。

分享到:
评论

相关推荐

    C#反射(Reflection)对类的属性get或set值实现思路

    如果代码中使用了属性,可以利用反射对它们进行访问。 下面的例子,是Insus练习对一个类别的属性进行set和get值。 首先写一个类,再写一个可读写的属性: 代码如下: using System; using System.Collections.Generic...

    使用JSON绑定实体对象属性值到页面TextBox控件

    利用反射将实例化得到的实体对象转换为JSON格式的字符串,前台JS转换为JSON对象后使用Jquery将值绑定到页面对应的控件中。便利:不需要后台代码逐行一个个控件进行付值

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    =========== 软件说明: 1.1 引言 约有90%的企业信息化管理系统基于数据库实现,这类系统中又有超过30%的代码集中在数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与...

    01:详解C#中的反射.pdf

    (7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。 (8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的...

    tinyrefl:正在进行的最小C ++静态反射API和代码生成工具

    特征反映类和枚举: 类和枚举名称用户声明的构造函数公众成员职能公共成员变量枚举值所有反射实体上的用户定义属性C ++ 14静态反射API :将枚举值转换为字符串,获取类的成员函数集,检查属性,访问对象成员......

    PHP获取类私有属性的3种方法

    反射可以获取类的详细信息,要获取私有属性的值,只需将对应属性的ReflectionProperty实例设置为可访问再取值即可。示例代码如下: namespace tlanyan; class Foo { private $bar = Foo bar!; } // 获取反射类及...

    Java开发技术大全(500个源代码).

    changeFields.java 改变属性值示例 Circle.java 一个用于测试的简单类 DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用...

    net学习笔记及其他代码应用

    答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...

    codematic2

    动软.Net代码生成器Codematic 是一款为C#程序员设计的自动代码生成器,Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。...

    Codematic2

    动软.Net代码生成器Codematic 是一款为C#程序员设计的自动代码生成器,Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。...

    精通MFC (光盘) 源代码

    16.1.7 装箱:值类型到引用类型的转化 16.1.8 托管类型和非托管类型的混用 16.1.9 固定指针 16.2 常用的托管C++编程技能 16.2.1 声明托管类 16.2.2 声明值类型的托管类型 16.2.3 添加属性 16.2.4 定义及实现...

    java元注解.docx

    RetentionPolicy.RUNTIME:注解被保留在编译后的字节码文件中,并且在运行时可通过反射访问。 @Target:这个元注解用于指定被注解的注解可以应用于哪些元素。它有一个ElementType数组类型的属性value,可以包含以下...

    AppFramework_V1.0

    1.1 引言 约有90%的企业信息化管理系统基于数据库实现,这类系统中又有超过30%的代码集中在数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与业务无关功能,例如面向对象的持久化与...

    AppFramework_V1.0_New

    =========== 软件说明: 1.1 引言 约有90%的企业信息化管理系统基于数据库实现,这类系统中又有超过30%的代码集中在数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与...

    asp.net面试题

    然后,可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将...

    疯狂JAVA讲义

    学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 使用内部类 208 学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在...

Global site tag (gtag.js) - Google Analytics