本帖属于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怎么获取里面所有的属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)