如何遍历一个实例的所有属性,得到属性的名称和值

如何遍历一个实例的所有属性,得到属性的名称和值

  Type   t   =   this.GetType();  
  MethodInfo   mii   =   t.GetProperty("a").GetGetMethod();  
  Console.WriteLine(mii.Invoke(this,null));

利用反射。  
  static   void   Main(string[]   args)  
  {  
  MoneyHome.Class.DataOperate   d   =   new   MoneyHome.Class.DataOperate();//实例  
  Type   t   =   d.GetType();  
  MessageBox.Show(t.Namespace,"DataOperate类的命名空间");  
  MessageBox.Show(t.IsClass.ToString(),"DataOperae是不是一个类");  
  MemberInfo[]   m   =   t.GetMembers();  
  StringBuilder   st   =   new   StringBuilder(800);  
  foreach(MemberInfo   m1   in   m)  
  {  
  st.Append("Members:     ");  
  st.Append(m1.ToString());  
  st.Append("\n");  
  }

  Type   t   =   this.GetType();  
  PropertyInfo[]   arrpf=   t.GetProperties();  
  foreach(PropertyInfo   p   in   arrpf)  
  {  
  // MethodInfo   mii   =   t.GetProperty(p.Name).GetGetMethod();  
  // Console.WriteLine(mii.Invoke(this,null));  
  Console.WriteLine(p.GetValue(this,null).ToString());  
  }Top

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();
 }

在类中定义了一个属性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


`QVariantPropertyManager` 是 Qt 一个类,用于管理对象的动态属性(properties),这些属性可以是基本类型、自定义类型或者从 `QObject` 继承的复杂类型。如果你想遍历所有的属性及其组别,你可以按照以下步骤操作: 1. 首先,确保你有一个拥有 `QMetaObject` 的 QObject 实例,因为 `QVariantPropertyManager` 建立在 `QMetaObject` 之上。 ```cpp QObject* obj = ...; // 你的对象实例 QMetaObject metaObj = obj->metaObject(); QVariantPropertyManager manager(obj, metaObj); ``` 2. 使用 `propertyNames()` 函数获取所有属性名的列表。这个函数返回一个 `QStringList`,包含了所有可读写的属性名。 ```cpp QStringList propertyNames = manager.propertyNames(); for (const QString& propertyName : propertyNames) { qDebug() << "Property Name: " << propertyName; } ``` 3. 如果你想知道每个属性属于哪个组(通常是根据它们的元数据分类),你需要检查每个属性的 `propertyType()` 和可能关联的 `propertyGroup()`。但请注意,不是所有的属性都一定有明确定义的组别,这取决于具体的属性类型和实现。 ```cpp foreach (const QString& propertyName, propertyNames) { int typeId = manager.propertyType(propertyName); QMetaObject::PropertyInfo propInfo = metaObj.property(typeId); if (!propInfo.isFlagSet(QMetaObject::PropIsGroup)) { qDebug() << "Property: " << propertyName << ", Type: " << manager.typeName(typeId); } else { qDebug() << "Group Property: " << propertyName << ", Group Name: " << manager.groupName(propInfo.name()); } } ``` 在这个例子,`isFlagSet()` 检查了属性是否为组,`groupName()` 则返回了属性所在的组别名称,如果该属性不属于任何组,则返回空字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值