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