MyObject myObj = new MyObject();
   MyObject有两个属性,属性的名字为:“name”和“address”。我如何设置这两个属性的值呢?
   应该是用到反射,但是都有哪些形式呢?求一种比较好的方法

解决方案 »

  1.   

    难道没有 set 方法么? 不解、、、
      

  2.   

    为什么要用反射?直接调用Myobject的setName方法和setAddress方法不好吗?
      

  3.   

    我是动态的到的属性的名字,不能确定调用那个set方法
      

  4.   

    Java中有两种实例化的方式: 一种是显示的new:new Object(); 
    一种是反射机制:Class.forName(pockageName.className).newInstance(); 现在 MyObject myObj = new MyObject();
    有创建对象了,设值就可以了:
    如果有set器,可调用set器 设置就好了。如果没有智能用 "." 了
    不知道 有没理解对楼主的意思。
      

  5.   

    呵呵,我都说过用反射了。
    还是我没说明白啊。
    不过我自己找了一个PropertyDescriptor,大家可以看看
      

  6.   

    给你看个例子 form
    public class form {  private String age;  public String getAge() {
        return age;
        
      }
      public void setAge(String age) {
        this.age = age;
      }}testClass c = Class.forName("form");  
          Class types[] =new Class[1];  
           types[0]=Class.forName("java.lang.String");
             Method m = c.getMethod("setAge",types ); //setAge就是动态方法的名字
             form t = new form();  
            m.invoke(t,"11212" );//传给方法的的参数  
            System.out.println(t.getAge());
      

  7.   

    举个例子给你吧,希望对你有帮助假设 User类两个 属性 name 和 address , user为User的实例// 取得属性数组
    Field[] fs = user.getClass.getDeclaredFields();
    for(Field f : fs) {
       f.setAccessible(true);
       f.set(user,属性值);
    }
      

  8.   

    getDeclaredFields()也是一个好办法
      

  9.   

    public static void setFieldValue(Object object, String fieldName, Object newValue)
           throws IllegalArgumentException,IllegalAccessException, NoSuchFieldException {
        Field field = getDeclaredField(object, fieldName);
        field.setAccessible(true);
        field.set(object, newValue);
    }
    getDeclaredField方法要自己写一下,不过也可以用    Class<?> clazz = object.getClass();
        Field field = clazz.getDeclaredField(fieldName);但这样只能从给定的类中检索字段,不能检索继承的字段。
    public static Field getDeclaredField(Object object, String name) throws NoSuchFieldException {
        Field field = null;
        Class<?> clazz = object.getClass();
        do {
            try {
                field = clazz.getDeclaredField(name);
            } catch (Exception e){ }
        } while (field == null & (clazz = clazz.getSuperclass()) != null); 
        if (field == null) {
            throw new NoSuchFieldException();
        }
        return field;
    }
      

  10.   

    楼上的就可以了
    如果要改继承的父类字段,除非父类中有set()方法
    这样你就可以用子类CLASS调用getMetheds()得到父类的set方法,然后invoke()
      

  11.   

    属性名字xxx,调用setXxx();            String firstLetter = fieldName.substring(0, 1).toUpperCase();
                // 获得和属性对应的setXXX()方法的名字
                String setMethodName = "set" + firstLetter + fieldName.substring(1);
                // 获得和属性对应的setXXX()方法
                Method setMethod = classType.getMethod(setMethodName,new Class[]{field.getType()});
                setMethod.invoke(object, new Object[]{value});
      

  12.   

    PropertyDescriptor clazzPd = BeanUtils.getPropertyDescriptor(clazz,
    propretyName);
    if (clazzPd != null) {
    Class type = clazzPd.getPropertyType();
    Method setMethod = clazzPd.getWriteMethod();
                                    setMethod.invoke(object, new Object[] { value });

    getWriteMethod是set方法,getReadMethod()是get方法,