用你现在用的语言写出这个反射功能可能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 BookJava版本:
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: 用多种语言实现一个功能,可以更好的学习和掌握各个语言的区别。
本文对比了使用不同编程语言实现反射功能的方法,包括JavaScript、Swift3.0和Java。介绍了每种语言的具体实现细节,并讨论了它们之间的差异。
3463

被折叠的 条评论
为什么被折叠?



