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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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("修改失败");
       }
    }
}



24 个回复

倒序浏览
没看清你的标题,麻烦你再写一下,估计我可以帮你解答。
回复 使用道具 举报
心灵的微幸福 发表于 2014-6-4 12:14
没看清你的标题,麻烦你再写一下,估计我可以帮你解答。

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

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

}
回复 使用道具 举报
楼主,你首先要理解一下字段是什么哦?并不是这个类里面有private static String kind="dog";就代表kind是Test1类的一个字段了。首先字段是只实现了get set方法的属性才叫做字段。 这句话Field field = obj.getClass().getDeclaredField(propertyName);是没办法获得对应的字段的。
回复 使用道具 举报
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. }
复制代码
回复 使用道具 举报 1 0
我也遇到了这个问题,不会做
回复 使用道具 举报
正巧刚刚做完这道题,上网查下做的对不对,搜到这里。发一下我的吧
  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. }
复制代码
回复 使用道具 举报 1 0
Dale 中级黑马 2014-9-13 17:11:07
8#
ysdolls 发表于 2014-8-26 12:48
正巧刚刚做完这道题,上网查下做的对不对,搜到这里。发一下我的吧

表示卡不懂!大哥!
回复 使用道具 举报
小弟的代码,感觉没必要用暴力反射啊,因为好像没必要封装类里面的变量,请指教:
  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. }
复制代码





回复 使用道具 举报
﹍清尘〢 发表于 2014-11-20 14:19
小弟的代码,感觉没必要用暴力反射啊,因为好像没必要封装类里面的变量,请指教:

看了下你的代码,把我自己代码改对了!:handshake
回复 使用道具 举报
来学习了
回复 使用道具 举报
很好,受教了
回复 使用道具 举报
感谢分享。
回复 使用道具 举报
赞一下~!
回复 使用道具 举报
不错   反射没学好  可惜了
回复 使用道具 举报
领教了,,
回复 使用道具 举报
本帖最后由 怀英 于 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. }
复制代码
回复 使用道具 举报 1 0
propertyName的属性的值设置为value.
回复 使用道具 举报
不错收获很多,入学考试应该用不到javabean吧,应该只是基础和反射部分吧!!
回复 使用道具 举报
学习了 谢谢
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马