如何反射出对象的所有属性?

本文对比了使用不同编程语言实现反射功能的方法,包括JavaScript、Swift3.0和Java。介绍了每种语言的具体实现细节,并讨论了它们之间的差异。

        用你现在用的语言写出这个反射功能可能too easy, 但如果让你用现在前端主流的Java、JavaScript、Object-C、Swift写呢?

       Object-C语言已经没落了,用Swift3.0语言更有前途, 看看最近苹果公司禁用JS Patch的事件就该明白,作为iOS开发者必须紧跟苹果的节奏。

      话说Swift和JS在有些地方很像,因为Swift借鉴了JS语言的特性。

先感受下JS的实现方式, 注意JS语法里一切都是对象, 下面所列了3中实例化对象的方法。 for in循环跟Swift类似,区别是for后面Swift不需要圆括号,但JS必须要圆括号。

PS:分号在JS语法里是可选的。

<script>
//声明类的第一种方式	
car = {color:"blue", length: 4, weight: "1000kg"}	
for (variable in car) {
	document.write(variable + ":" + car[variable] + "<br>")  //遍历对象属性
}
	
document.write("<br>")
	
//声明类的第二种方式	
function person(firstname,lastname,age,eyecolor){
	this.firstname=firstname;
	this.lastname=lastname;
	this.age=age;
    this.eyecolor=eyecolor;
}	
myFather=new person("John","Doe",50,"blue");
for (variable in myFather) {
	document.write(variable + ":" + myFather[variable] + "<br>")  //遍历对象属性
}	
document.write("<br>")

//第三种方式
var obj = new Object();
obj.myname = "张三"; //String类型
obj.age = 20;     //Number类型
obj.test = true;  //布尔类型
for (variable in obj) {
	document.write(variable + ":" + obj[variable] + "<br>")  //遍历对象属性
}	

document.write(myFather.firstname + " is " + myFather.age + " years old.");  //访问属性
document.write("<br>")  //换行
document.write(myFather["firstname"])  //访问属性
document.write("<br>")

</script>

Swift3.0实现方式:

struct Book {
    let name: String?
    let price: Int
    let test: Bool
}

let book = Book(name: nil, price: 10, test: true)
let mirror = Mirror(reflecting: book)
for case let (key?, value) in mirror.children {  //children是Array类型, for case表示参数不为nil
    print("key:\(key), value: \(value)")  
}

print(mirror.description)
输出:

key:name, value: nil
key:price, value: 10
key:test, value: true
Mirror for Book

Java版本:

   Person person = new Person();
        person.name = "zhangsan";
        person.age = 20;
        person.test = true;

        Class clz = person.getClass();
        Field[] fields = clz.getDeclaredFields();
        try {
            for (Field field : fields) {
                System.out.print(field.getName() + ":");
                Object value = field.get(person);
                if (value != null) {
                    System.out.print(String.valueOf(value));
                }
                System.out.println();
                //判断参数数据类型, 注意自动装箱和拆箱的语法特性
                /*
                if (value instanceof Double) {
                    System.out.print("double类型")
                } else if (value instanceof String) {
                    System.out.print("String类型")
                } else if (value instanceof Integer) {
                    System.out.println("int类型");
                }
                */
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
输出:

name:zhangsan
age:20
test:true

      通过对比可以看出, Java是最麻烦的,还要捕获异常;Swift3.0和JS的代码量较少,不需要捕获异常,而且代码很像。

    

      JSON序列化和反序列化用到反射语法,  比如Swift语言版本的SwiftyJSON、Java的fastjson/Gson。


PS: 用多种语言实现一个功能,可以更好的学习和掌握各个语言的区别。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值