如何获取自定义类的所有属性 以及属性的类型

如何获取自定义类的所有属性 以及属性的类型,第1张

如何获取自定义类的所有属性 以及属性的类型

本帖属于CocoaChina会员发表,转帖请写明来源和帖子地址

题目有点长

直接看代码

复制代码

@interface AppState : NSObject{

BOOL _passed;

int _int;

/

状态是否正常

/

BOOL isPassed;

/

用户数据

/

NSMutableDictionary userValues;

}

@property(nonatomic ,assign) float _float;

@property(nonatomic ,assign) double _double;

@property(nonatomic ,retain) NSDate _date;

@property(nonatomic ,assign) char _char;

@property(nonatomic ,assign) int _int;;

@property(nonatomic ,assign) BOOL _passed;

@property(nonatomic ,assign) BOOL

isPassed;

我通过

#import

<objc/runtimeh>

里面的这样的方式来获取 所有的属性名 以及属性类型

复制代码

unsigned int propertyCount = 0;

objc_property_t properties = class_copyPropertyList(klass,

&propertyCount);

for (unsigned int i = 0; i < propertyCount; ++i) {

objc_property_t property = properties[i];

const char name = property_getName(property);//获取属性名字

const char attributes = property_getAttributes(property);//获取属性类型

}

具体的输出如下所示

复制代码

输出类 state T@"AppState",&,N,Vstate

正常输出

_float Tf,N,V__float

_double Td,N,V__double

_date T@"NSDate",&,N,V__date

_char

Tc,N,V__char

前面正常获得了所需的属性名称

但是后面的这个串让我怎么获取类别呢??

PS:V__date 后面是

V_属性名

集合就需要循环遍历,而且是嵌套循环遍历

for(vai i in jsonobject)

for(vai j in jsonobject[i])

for(vai k in jsonobject[i][j]) //以此类推,直到找到为止

{

var obj = jsonobject[i][j][k]attrs

}

当然:如果你知道obj的具体位置,也可以直接读取 var obj = jsonobject[0][1][0]

jsmap是一种基于JavaScript的Map对象,它用来存储键值对,存储格式为:key-value。要获取jsmap中所有的属性,可以使用以下几种方法。

1 使用jsmapkeys()方法:该方法会返回一个包含所有键的数组,可以使用for循环来遍历该数组,从而获取所有的属性。

2 使用jsmapvalues()方法:该方法会返回一个包含所有值的数组,可以使用for循环来遍历该数组,从而获取所有的属性。

3 使用jsmapforEach()方法:该方法会接收一个回调函数,回调函数会接收三个参数:当前键、当前值和当前Map对象,可以使用这三个参数来获取jsmap中的所有属性。

4 使用Objectkeys()方法:该方法会返回一个包含所有可枚举属性的数组,可以使用for循环来遍历该数组,从而获取所有的属性。

5 使用Objectvalues()方法:该方法会返回一个包含所有可枚举属性的数组,可以使用for循环来遍历该数组,从而获取所有的属性。

以上就是获取jsmap中所有属性的几种方法,使用这些方法,可以轻松获取jsmap中所有的属性。

对象的类不知道,里面属性的类型也不知道。我感觉我没救了

用反射机制吧,很轻松!比如说:只知道对象a,问你要a里面所有属性值 问题补充:udvs 写道agetClass()getDeclaredFields()哥们,我要的是值,不是属性名,而且是私有的成员,公有的我能得到 问题补充:izhangh 写道 public static Object deepClone(Object obj) { try { ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oowriteObject(obj); // 从流里读回来 ByteArrayInputStream bi = new ByteArrayInputStream(botoByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return (oireadObject()); } catch(Exception e) { } return obj; }不得不承认你是玩流高手这都想得到,但是回的还是原来的对象啊,对象里面的私有属性值还是得不到啊 问题补充:zhanghaiyangruijie 写道这个用反射有点浪费了。。不知道这样能不能解决这个兄弟的问题package comzhytestprototype; public class TestClone { / 原型模式 @param args / public static void main(String[] args) { try { new TestClone()cloneObject(); } catch (CloneNotSupportedException e) { eprintStackTrace(); } } public void cloneObject() throws CloneNotSupportedException { Person p = new Person(); Man man = new Man(); mansetSalory("111123"); psetName("zhangfei"); psetMan(man); //mansetSalory("122335");//(1) Person pp = pgetClonePerson(p); mansetSalory("122335");//(2) ppsetName("aa"); Systemoutprintln("ppgetName()= " + ppgetName() + " ppmangetSalory()= "+ppgetMan()getSalory()); Systemoutprintln("pgetName()=" + pgetName()+" pmangetSalory()= "+pgetMan()getSalory()); } } class Person implements Cloneable { private String name = ""; private Man man; public String getName() { return name; } public void setName(String name) { thisname = name; } public Person getClonePerson(Person p) throws CloneNotSupportedException { Person pp = (Person) pclone(); return pp; } public Man getMan() { return man; } public void setMan(Man man) { thisman = man; } public Object clone() throws CloneNotSupportedException{ Person p = (Person) superclone(); pman = thisgetMan()getCloneMan(thisgetMan()); return p; } } class Man implements Cloneable{ private String salory = ""; public String getSalory() { return salory; } public void setSalory(String salory) { thissalory = salory; } public Man getCloneMan(Man man) throws CloneNotSupportedException{ Man ma = (Man)manclone(); return ma; } } 见解独到,但是有违提议,可以鼓励鼓励 问题补充:ouchxp 写道新手虽然昨天我也是

这段代码你可以执行一下试试

import javalangreflectField; import javalangreflectModifier; import sunmiscUnsafe; public class TestClass { private String name; public String getName() { return name; } public void setName(String name) { thisname = name; } public static void main(String[] args) throws Exception { TestClass tc = new TestClass(); tcsetName("oUCHxP"); //现在是一个未知类型的对象(模拟一下) Object obj = tc; //获取对象类型,可以看到输出是TestClass类型 Class c = objgetClass(); Systemoutprintln(c); //创建此类型的空对象 Field fu = UnsafeclassgetDeclaredField("theUnsafe"); fusetAccessible(true); Unsafe us = (Unsafe) fuget(null); Object newObj = usallocateInstance(c); //可以看到name是空的 Systemoutprintln("newObjname: " + ((TestClass) newObj)getName()); //获取所有成员(包括private)的值,并拷贝到新对象中 Field[] fields = cgetDeclaredFields(); for (Field f : fields) { //不拷贝static成员和final成员 if (ModifierisStatic(fgetModifiers()) || ModifierisFinal(fgetModifiers())) { continue; } fsetAccessible(true); Object fieldValue = fget(obj); fset(newObj, fieldValue); } //再看一下新对象里的内容,private成员也被复制过来了 Systemoutprintln("newObjname: " + ((TestClass) newObj)getName()); } }果然是老鸟,让你猜着了,但是呢,我也是本着不用反射来解题的。所以请各位再想想办法来解决这难题。 问题补充:ouchxp 写道zhanghaiyangruijie 写道这个用反射有点浪费了。。不知道这样能不能解决这个兄弟的问题lz 写道对象的类不知道,里面属性的类型也不知道。

采用反射,获取出Object 的属性等。

如下:

Field[] field = modelgetClass()getDeclaredFields(); // 获取实体类的所有属性,返回Field数组

try {

for (int j = 0; j < fieldlength; j++) { // 遍历所有属性

String name = field[j]getName(); // 获取属性的名字

name = namesubstring(0, 1)toUpperCase() + namesubstring(1); // 将属性的首字符大写,方便构造get,set方法

String type = field[j]getGenericType()toString(); // 获取属性的类型

if (typeequals("class javalangString")) { // 如果type是类类型,则前面包含"class ",后面跟类名

Method m = modelgetClass()getMethod("get" + name);

String value = (String) minvoke(model); // 调用getter方法获取属性值

if (value == null) {

m = modelgetClass()getMethod("set"+name,Stringclass);

minvoke(model, "");

}

}

if (typeequals("class javalangInteger")) {

Method m = modelgetClass()getMethod("get" + name);

Integer value = (Integer) minvoke(model);

if (value == null) {

m = modelgetClass()getMethod("set"+name,Integerclass);

minvoke(model, 0);

}

}

if (typeequals("class javalangBoolean")) {

Method m = modelgetClass()getMethod("get" + name);

Boolean value = (Boolean) minvoke(model);

if (value == null) {

m = modelgetClass()getMethod("set"+name,Booleanclass);

minvoke(model, false);

}

}

if (typeequals("class javautilDate")) {

Method m = modelgetClass()getMethod("get" + name);

Date value = (Date) minvoke(model);

if (value == null) {

m = modelgetClass()getMethod("set"+name,Dateclass);

minvoke(model, new Date());

}

} // 如果有需要,可以仿照上面继续进行扩充,再增加对其它类型的判断

}

} catch (NoSuchMethodException e) {

eprintStackTrace();

} catch (SecurityException e) {

eprintStackTrace();

} catch (IllegalAccessException e) {

eprintStackTrace();

} catch (IllegalArgumentException e) {

eprintStackTrace();

} catch (InvocationTargetException e) {

eprintStackTrace();

}

该属性返回对象类型原型的使用。

参数说明:

objectName:是对象的名称。

用prototype属性可以提供对象的类的一组基本功能。对象的新实例“继承”赋予该对象原型的 *** 作。

例如,要为Array对象添加返回数组中最大元素值的方法是,声明该函数,将它加入Arrayprototype,并使用它。

//结果:7,y保存数组x中的最大值

该属性表示创建对象的函数

参数说明:

object:必选项。是对象或函数的名称。

constructor属性是所有具有prototype的对象的成员。它们包括除Global和Math对象以外的所有js固有对象。constructor属性保存了对构造特定对象实例的函数的引用。例如:

//结果: true

以上就是关于如何获取自定义类的所有属性 以及属性的类型全部的内容,包括:如何获取自定义类的所有属性 以及属性的类型、jsonobject如何获取一个集合里的某个对象所有属性的值、jsmap怎么获取里面所有的属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9688779.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存