A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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 = "修改前是这样的";

}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马