如何获取java类中的变量名的字串

http://daimojingdeyu.blogbus.com/logs/5185456.html

在类中定义了一个属性abc,如何获取这个变量的abc的名字串呢?也就是说怎么知道abc这个变量的名字是abc,这个问题比较的好玩。

这个是偶在一开发中遇到的一个比较有趣的问题,找 了半天的资料加下偶辛勤的思考,终于找到的解决方法。用反射~~~

java提供了很强大的反射机制,可以说比动态语言还动态。但是这个东东平时的应用不是很多的说。

现提供一个可以动态获取对象中的变量的变量名称的方法:

 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[i]对应的对象中的变量
                Object o = fields[i].get(f);
                System.out.println("传入的对象中包含一个如下的变量:" + varName +  " = " + o);
                // 恢复访问控制权限
                fields[i].setAccessible(accessFlag);
            } catch (IllegalArgumentException ex) {
                ex.printStackTrace();
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
            //  测试代码用来获取一个JLabel中声名的所有的属性名和其属性变量
            setAllComponentsName(new JLabel("测试"));
    }
 }

 fields[i].setAccessible(true); 这句主要是因为私有的变量在对象外是无法访问的,通过这个设置就可以改变私有变量的访问权,还真的有点恐怖,当偶把这个解决方法告诉Boss的时候,Boss差点吐血,私有的都能访问了,还有什么安全可言?

不过了,有安全就有特权,所以由于能很好的解决问题还是被采纳了,嘻嘻~~~

Object o = fields[i].get(f); 这句的作用就是取得传入对象f中类的属性fields[i]对应的真实的属性变量,说的有点别扭,比如有一个类A中有一个int abc的属性,并且我们有两个A类的对象a1,a2,那么当我们用fields[i].get(a1) 的时候得到的将是对象a1中的具体的abc属性,而我们用fields[i].get(a2) 的时候得到的将是对象a2中的具体的abc属性。

最后是用一个main方法测试了一个JLabel对象,打印出了JLabel中声名的所有的变量名,并输出了其对应的变量的值。结果如下:

传入的对象中包含一个如下的变量:uiClassID = LabelUI
传入的对象中包含一个如下的变量:mnemonic = 0
传入的对象中包含一个如下的变量:mnemonicIndex = -1
传入的对象中包含一个如下的变量:text = 测试
传入的对象中包含一个如下的变量:defaultIcon = null
传入的对象中包含一个如下的变量:disabledIcon = null
传入的对象中包含一个如下的变量:disabledIconSet = false
传入的对象中包含一个如下的变量:verticalAlignment = 0
传入的对象中包含一个如下的变量:horizontalAlignment = 10
传入的对象中包含一个如下的变量:verticalTextPosition = 0
传入的对象中包含一个如下的变量:horizontalTextPosition = 11
传入的对象中包含一个如下的变量:iconTextGap = 4
传入的对象中包含一个如下的变量:labelFor = null
传入的对象中包含一个如下的变量:LABELED_BY_PROPERTY = labeledBy

 

随机文章:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值