黑马程序员技术交流社区

标题: 反射JDK自带的应用数据类型获取不到变量名吗 [打印本页]

作者: 蒙武辉    时间: 2012-4-28 17:07
标题: 反射JDK自带的应用数据类型获取不到变量名吗
如题
import java.lang.reflect.Field;

public class MyTools {

        public static void setAllComponentsName(Object f) {

                // 获取f对象对应类中的所有属性域
                Field[] fields = f.getClass().getDeclaredFields();
                for (int i = 0, len = fields.length; i < len; i++) {

                        // 对于每个属性,获取属性名
                        String varName = fields[i].getName();
                        try {

                                // 获取原来的访问控制权限
                                boolean accessFlag = fields[i].isAccessible();

                                // 修改访问控制权限
                                fields[i].setAccessible(true);

                                // 获取在对象f中属性fields对应的对象中的变量
                                Object o = fields[i].get(f);

                                System.out.println("传入的对象中包含一个如下的变量:\n" + varName + " = " +
                                                o);

                                // 恢复访问控制权限
                                fields[i].setAccessible(accessFlag);

                        } catch (IllegalArgumentException ex) {
                                ex.printStackTrace();
                        } catch (IllegalAccessException ex) {

                                ex.printStackTrace();
                        }
                }
        }

        public static void main(String[] args) {

                // 测试代码用来获取一个JLabel中声名的所有的属性名和其属性变量
                Person xiaoming = new Person("小明",22);
                setAllComponentsName(xiaoming);
                Person xiaoqiang = new Person("小强",33);
                setAllComponentsName(xiaoqiang);

        }
}
作者: 张文建    时间: 2012-4-28 18:44
get
public Object get(Object obj)
           throws IllegalArgumentException,
                  IllegalAccessException返回指定对象上此 Field 表示的字段的值。如果该值是一个基本类型值,则自动将其包装在一个对象中。
基础字段的值是按以下方式获得的:

如果基础字段是一个静态字段,则忽略 obj 变量;它可能为 null。

否则,基础字段是一个实例字段。如果指定的 obj 变量为 null,则该方法将抛出一个 NullPointerException。如果指定对象不是声明基础字段的类或接口的实例,则该方法将抛出一个 IllegalArgumentException。

如果此 Field 对象强制实施 Java 语言访问控制,并且基础字段是不可访问的,则该方法将抛出一个 IllegalAccessException。如果基础字段是静态的,并且声明该字段的类尚未初始化,则初始化这个类。

否则,从基础实例字段或静态字段中检索该值。如果该字段是一个基本类型字段,则在返回前将该值包装在一个对象中,否则照原样返回。

如果字段隐藏在 obj 的类型中,则根据前面的规则获得字段的值。



作者: 张文建    时间: 2012-4-28 18:46
public static void setAllComponentsName(Object f) 这个是静态方法,如果基础字段是一个静态字段,则忽略f变量,返回null.
初学多多指教





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