public class Person
{
String name;
int age;
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
}
现在有一个Person类的对象.person_instance.如果我知道该对象有一个字段age..
那么如何取出person_instance对象中age字段的值呢? 不能用getAge函数.因为对我们而言,getAge函数不知道是不是取的就是age字段。

解决方案 »

  1.   

    反射机制是通过getAge函数来读取的
    按照java编码风格,getAge()不读取age变量不合规范
      

  2.   

    public object getValue(String strKey)
    {
       //
       if(strKey == "Name") return name;
       if(strKey == "Age") return age;
       return null;
    }
      

  3.   

    可以的吧,person_instance的getDeclaredField(),得到Field对象再去取值
      

  4.   

    執行期變更fields 內容
    與先前兩個動作相比,「變更field 內容」輕鬆多了,因為它不需要參數和引數。
    首先呼叫Class 的getField()並指定field 名稱。獲得特定的Field object 之後
    便可直接呼叫Field 的get()和set(),如圖9。#001 public class Test {
    #002 public double d;
    #003
    #004 public static void main(String args[])
    #005 {
    #006 Class c = Class.forName("Test");
    #007 Field f = c.getField("d"); //指定field 名稱
    #008 Test obj = new Test();
    #009 System.out.println("d= " + (Double)f.get(obj));
    #010 f.set(obj, 12.34);
    #011 System.out.println("d= " + obj.d);
    #012 }
    #013 }
    圖9 / 動態變更field 內容
      

  5.   

    反射机制可以做到。
    但是你的需求是想取得Age的值
    我们写getAge方法就是取值,这是变成规范。
      

  6.   

    测试通过:
    package test;import java.lang.reflect.Field;public class TestReflect {
    public double d;
    int aaa; public static void main(String args[]) {
    try {
    TestReflect test = new TestReflect();
    Class c = test.getClass();
    Field f = c.getField("d"); TestReflect obj = new TestReflect();
    System.out.println("d= " + (Double) f.get(obj));
    f.set(obj, 12.34);
    System.out.println("d= " + obj.d);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  7.   

    楼上的几位,可以通过。但是你们都是建立在一个前提下,那就是预先知道了该数据的类型为double..如果不知道呢?
      

  8.   

    不知道数据类型可以用Object,但你的字段如果是私有的就不能通过field取了,如果你getter方法都不对应,那还写的什么java啊
      

  9.   

    jihanzhong(逍遥) :
    JBoss里边大堆的这种代码。
    下边是我的部分代码,这部分代码所在的类有一个功能是将该类的对象序列化成一个Hashtable.
    Field[] fields = this.getDeclaredFields();
    for ( ...) {
    fields[i].setAccessible(true);  // 注意,在访问私有变量之前需要设置该属性
    if ((fields[i].getModifiers() & Modifier.STATIC) != 0)   // 忽略静态变量
    continue;
    Class fieldCls = fields[i].getType();
    String fieldType = fieldCls.toString();
    Object fieldObj = fields[i].get(obj); // this is what you want
    }