黑马程序员技术交流社区

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

作者: 沐小北    时间: 2014-6-4 11:09
标题: 写一个方法,此方法可将obj对象中名为propertyName的属性的...
public class Test1 {
/**
   public void setProperty(Object obj, String propertyName, Object value){   
  }
  * @param args
  */

    private static String kind="dog";
public static void main(String[] args) {
  // TODO Auto-generated method stub
       Test1 a = new Test1();
       setProperty sp =new setProperty();
       //调用setProperty类中的方法,并将所要改变的值传递过去
       sp.setProperty(a, "kind", "dog");
       System.out.print("动物种类:"+Test1.kind);
}
}
class setProperty{
public void setProperty(Object obj, String propertyName, Object value)
{   
  try {
   //获得反射对象
   Field field = obj.getClass().getDeclaredField(propertyName);
   //设置可以访问变量
   field.setAccessible(true);
   //将kind由dog改变为cat
   field.set(obj,"cat");
  } catch (Exception e) {
   //改变失败则输出修改失败"修改失败"
   System.out.println("修改失败");
       }
    }
}




作者: 心灵的微幸福    时间: 2014-6-4 12:14
没看清你的标题,麻烦你再写一下,估计我可以帮你解答。
作者: 沐小北    时间: 2014-6-4 12:20
心灵的微幸福 发表于 2014-6-4 12:14
没看清你的标题,麻烦你再写一下,估计我可以帮你解答。

写一个方法,此方法可将obj对象中名为propertyName的属性的值设置为value.   

public void setProperty(Object obj, String propertyName, Object value){   

}
作者: 123_yaya    时间: 2014-6-4 12:54
楼主,你首先要理解一下字段是什么哦?并不是这个类里面有private static String kind="dog";就代表kind是Test1类的一个字段了。首先字段是只实现了get set方法的属性才叫做字段。 这句话Field field = obj.getClass().getDeclaredField(propertyName);是没办法获得对应的字段的。
作者: 123_yaya    时间: 2014-6-4 13:05
123_yaya 发表于 2014-6-4 12:54
楼主,你首先要理解一下字段是什么哦?并不是这个类里面有private static String kind="dog";就代表kind是T ...

测试了一下,是能改到属性值的,表示凌乱了。一般javabean和获取javabean的反射方法是分开的。这是我自己写的一个反射方法,楼主可以看看。
  1. public class User {
  2. private String name;
  3. private int age;
  4. public String getName() {
  5.         return name;
  6. }
  7. public void setName(String name) {
  8.         this.name = name;
  9. }
  10. public int getAge() {
  11.         return age;
  12. }
  13. public void setAge(int age) {
  14.         this.age = age;
  15. }
  16. }

  17. public class IntroSpectorTest {
  18.         public static void main(String[] args) {
  19.                 try {
  20.                         User user = new User();
  21.                         // 通过内省写入name的值
  22.                         String propertyName = "name";
  23.                         Object value = "zhangsan";
  24.                         setProperty(user, propertyName, value);
  25.                         // 通过内省写入age的值
  26.                         propertyName = "age";
  27.                         value = 21;
  28.                         setProperty(user, propertyName, value);
  29.                         //打印出结果
  30.                         System.out.println(user.getName());
  31.                         System.out.println(user.getAge());
  32.                 } catch (Exception e) {
  33.                         e.printStackTrace();
  34.                 }
  35.         }

  36.         private static void setProperty(Object user, String propertyName, Object value)
  37.                         throws IntrospectionException, IllegalAccessException,
  38.                         InvocationTargetException {
  39.                 PropertyDescriptor pd;
  40.                 pd = new PropertyDescriptor(propertyName, user.getClass());
  41.                 Method methodSetName=pd.getWriteMethod();
  42.                 methodSetName.invoke(user, value);
  43.         }
  44. }
复制代码

作者: 宋大人-专注    时间: 2014-7-18 13:55
我也遇到了这个问题,不会做
作者: ysdolls    时间: 2014-8-26 12:48
正巧刚刚做完这道题,上网查下做的对不对,搜到这里。发一下我的吧
  1. package com.ys;

  2. import java.lang.reflect.Field;

  3. /*
  4. 写一个方法,public void setProperty(Object obj,String propertyName,Object value){},
  5. 此方法可将obj 对象中名为 propertyName 的属性的值设置为value。
  6. */
  7. public class Demo06 {
  8.         public static void setProperty(Object obj,String propertyName,Object value){
  9.                 try {
  10.                         obj.getClass().getDeclaredField(propertyName).set(obj, value);

  11.                 } catch (Exception e) {
  12.                         e.printStackTrace();
  13.                 }
  14.                
  15.         }

  16.         public static void main(String[] args) {
  17.                 Demo_06 d6 = new Demo_06();
  18.                 Object o1 = new Object();
  19.                 System.out.println(d6.name);
  20.                 setProperty(d6,"name",o1);
  21.                 System.out.println(d6.name);
  22.                 System.out.println(o1);
  23.                
  24.         }
  25. }

  26. class Demo_06{
  27.         Object name;
  28. }
复制代码

作者: Dale    时间: 2014-9-13 17:11
ysdolls 发表于 2014-8-26 12:48
正巧刚刚做完这道题,上网查下做的对不对,搜到这里。发一下我的吧

表示卡不懂!大哥!
作者: ﹍清尘〢    时间: 2014-11-20 14:19
小弟的代码,感觉没必要用暴力反射啊,因为好像没必要封装类里面的变量,请指教:
  1. public class Test3 {
  2.         public static void main(String[] args) {
  3.                 //定义一个字符串,以便识别传入后是否设置值
  4.                 String pp = "oldvalue";
  5.                 //实例化Demo类的对象
  6.                 Demo1 d = new Demo1(pp);
  7.                 //打印未设置时候的d.propertyName值
  8.                 System.out.println(d.propertyName);
  9.                 //调用setProperty,将Demo的Obj对象传入,修改Demo类中名为propertyName的值为value
  10.                 setProperty(d,"propertyName","value");
  11.                 //打印设置后的d.propertyName值
  12.                 System.out.println(d.propertyName);
  13.         }
  14.         //此方法可将obj对象中名为propertyName的属性的值设置为value.   
  15.         public static void setProperty(Object obj,String propertyName,Object value){
  16.                 //捕获异常
  17.                 try {
  18.                         //定义Field使用反射,得到传入的名为“propertyName”的变量的字节码
  19.                         Field field = obj.getClass().getField(propertyName);
  20.                         //设置该“propertyName”的值为value
  21.                         field.set(obj, value);
  22.                 }
  23.                 //处理异常
  24.                 catch (Exception e) {
  25.                         //改变失败则输出修改失败"修改失败"
  26.                         System.out.println("修改失败");
  27.                 }       
  28.         }       
  29. }
  30. //测试类
  31. class Demo1{
  32.         //定义一个字符串
  33.         public String propertyName = "";
  34.         //定义一个带参构造方法,传入一个String类型的字符串
  35.         public Demo1(String propertyName) {
  36.                 //继承空参构造函数
  37.                 super();
  38.                 //赋值
  39.                 this.propertyName = propertyName;
  40.         }       
  41. }
复制代码






作者: shenzf    时间: 2015-3-27 13:23
﹍清尘〢 发表于 2014-11-20 14:19
小弟的代码,感觉没必要用暴力反射啊,因为好像没必要封装类里面的变量,请指教:

看了下你的代码,把我自己代码改对了!:handshake
作者: 胡谭龙    时间: 2015-4-1 09:33
来学习了

作者: silencer    时间: 2015-4-25 20:14
很好,受教了
作者: sdsmwl    时间: 2015-4-28 18:34
感谢分享。
作者: 刘斌斌    时间: 2015-5-1 16:41
赞一下~!
作者: 小王泽哥    时间: 2015-5-20 09:18
不错   反射没学好  可惜了
作者: xiaoqiao    时间: 2015-6-7 19:33
领教了,,
作者: 怀英    时间: 2015-6-8 19:36
本帖最后由 怀英 于 2015-7-17 22:20 编辑

我没有写main方法里面的实现,感觉题目没有说要写,只要写个方法就行了。暴力反射我用了,因为不确定它到底是不是public的。
  1. import java.lang.reflect.Field;

  2. /*
  3. * 4、
  4. * 写一个方法,此方法可将obj对象中名为propertyName的属性的值设置为value.   
  5. *        
  6. * public void setProperty(Object obj, String propertyName, Object value){...}
  7. *
  8. * hy_think:
  9. * 仅仅只要写一个方法就行,,,
  10. * ,,,>设置属性值,,》但我不知道这个属性是什么,,》
  11. *
  12. * ,,》只知道他有个属性交property,,,》并且要传入的值是value
  13. *
  14. * ,,》用反射做
  15. *
  16. * 1.取得object类的class文件
  17. * 2.取得属性
  18. * 3.设置属性的访问权限为true
  19. * 4.将值赋给属性
  20. *
  21. */
  22. public class Demo4 {

  23.         /**
  24.          * @param args
  25.          */
  26.         public static void main(String[] args) {
  27.                 // TODO Auto-generated method stub

  28.         }
  29.         
  30.         public void setProperty(Object obj, String propertyName, Object value){
  31.                 try {
  32.                         Class clazz = obj.getClass();
  33.                         Field fdPN = clazz.getDeclaredField("propertyName");
  34.                         fdPN.setAccessible(true);
  35.                         fdPN.set(obj, value);
  36.                         
  37.                 } catch (NoSuchFieldException e) {
  38.                         // TODO Auto-generated catch block
  39.                         e.printStackTrace();
  40.                 } catch (SecurityException e) {
  41.                         // TODO Auto-generated catch block
  42.                         e.printStackTrace();
  43.                 } catch (IllegalArgumentException e) {
  44.                         // TODO Auto-generated catch block
  45.                         e.printStackTrace();
  46.                 } catch (IllegalAccessException e) {
  47.                         // TODO Auto-generated catch block
  48.                         e.printStackTrace();
  49.                 }
  50.         }

  51. }
复制代码

作者: ym123456    时间: 2015-7-7 16:13
propertyName的属性的值设置为value.
作者: shdosh    时间: 2015-9-5 21:18
不错收获很多,入学考试应该用不到javabean吧,应该只是基础和反射部分吧!!
作者: z6528328    时间: 2015-9-22 23:32
学习了 谢谢
作者: 1975532882    时间: 2015-10-20 19:01
牛叉】,,,,,,,
作者: 止如初见    时间: 2015-11-6 11:44
解决了一大难题啊,
作者: LLLLL    时间: 2015-12-2 16:38
666666666666666666666
作者: 744919632    时间: 2015-12-17 20:07
表示没有看懂。
作者: zcbcba123    时间: 2015-12-17 20:08
给力~~~~~




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