黑马程序员技术交流社区

标题: 写一个方法,此方法可将obj对象中名为propertyName的属性的... [打印本页]

作者: China_Riven    时间: 2015-7-21 22:31
标题: 写一个方法,此方法可将obj对象中名为propertyName的属性的...
package com.itheima;

import java.lang.reflect.Field;

public class Test3
{

    /**
     * 3、 写一个方法,此方法可将obj对象中名为propertyName的属性的值设置为value.
     * public void setProperty(Object obj, String propertyName, Object value){}
     * 思路:正常情况下,我们给自己写的类的属性设置值,可以用set方法,但是根据题目要求只能用反射了.
     *
     * @throws Exception
     * @throws NoSuchFieldException
     *
     */
    public static void main(String[] value)
            throws ReflectiveOperationException, Exception
    { // 创建对象用来调方法用
        Test3 t = new Test3();
        // 创建自定义类的对象
        Person p = new Person();
        // 定义个字符串,用来作为我们要修改的数据
        String s = "value";
        // 调用方法
        t.setProperty(p, "propertyName", s);
        System.out.println(p.propertyName);
    }

    // obj是对象,propertyName是对象的属性,value是属性的值
    public void setProperty(Object obj, String propertyName, Object value)
            throws NoSuchFieldException, Exception
    {
        // 获取字节码文件对象
        Person p = new Person();
        @SuppressWarnings("unchecked")
        Class<Person> c = (Class<Person>) p.getClass();
        // 调用Class类中的方法,获取字段对象
        Field f = c.getDeclaredField(propertyName);
        // 暴力反射
        f.setAccessible(true);
        // 给属性赋值
        f.set(obj, value);
    }

}

// 在object类里面没有propertyName属性,这里定义一个类,给这个属性.
class Person
{
    String propertyName = "修改前是这样的";

}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2