网站首页 > java教程 正文
不知道大家在使用Java的反射时,是怎样将一个随机的对象解析成Json的。
我的做法是:获取类中所有字段的名称,然后在跟 ‘set’ 或 ‘get’ 拼接起来,然后在使用 Method 的 invoke() 方法进行调用。
不过在kotlin中的属性,一般是没有java中的那些 'getter' 和 ‘setter’ 的。我们该通过何种方式来获取属性的值呢?
其实,要在Kotlin中获取属性的值比Java要更加便捷。看看下面这段代码
val props=t::class.memberProperties
props.forEach {
println(it.call(t))
}
在这里通过使用类的字面量,可以获取到KClass对象。这里面保存了类似java中Class的内容。从中可以获取和这个对象或类相关的属性、成员函数、扩展函数、构造函数、静态属性等等信息。具体写法是这样的:
val c = MyClass::class
注意:要想使用某个类的实例来获取类的字面量,则该实例对应的类型必须是nullable的。
这里我就不得不吐槽一下,kotlin中一点很蛋疼的地方。在Kotlin 明明默认Any作为Kotlin中所有类的基类,类似于Java中的Object。可是,为甚么在使用范型的时候,范型所对应的类型却不是Any的基类。
所以在我一开始想使用范型来实现的时候,编译器总是报下面这样的错:
Error:(20, 19) Kotlin: Expression in a class literal has a nullable type 'T', use !! to make the type non-nullable
所以,如果想结合范型和反射机制的话,还是得使用java中的 Class对象才行。在kotlin中你可以通过以下代码获取到Java的Class对象:
val clazz=T::class.java
好了,现在再让我们回过头来看看,之前代码中的 props 变量。他的类型是 Collection<KProperty1<out Any,Any>>。保存了,类实例中的属性的相关信息。我们可以从中获取到相应属性的值。只要使用下面这段代码:
val propValue=prop.call(t)//t 持有该属性的类的实例。
所以最终,将一个简单的对象转换成Json字符串的代码是这样子的:
object ObjectMapper {
fun parse(t:Any):String{
val props=t::class.memberProperties
var jsonStr="{${t::class.simpleName}:{"
props.forEachIndexed { index, it ->
jsonStr+="\"${it.name}\":\"${it.call(t)}\""+if(index==props.size-1) "" else ","
}
jsonStr+="}}"
return jsonStr
}
}
注意:有人如果是刚学Kotlin的话,可能对上面代码中的 if...else 语句的用法感到有些奇怪:怎们直接和前面的字符串用加号连起来了呢?其实,再Kotlin中 if...else 是可以当作表达式来使用的,代替了Java中三元表达式。
使用:
fun main(args: Array<String>) {
val json=ObjectMapper.parse(User("feint",11,"1231241"))
println(json)
}
User 类:
class User(val name: String="",val age: Byte=0,val password:String="")
最后输出的结果是这样的:
{User:{"age":"11","name":"feint","password":"1231241"}}
最后再说一点,通过反射机制获取的属性默认是只读的,也就是说你只能获取属性的值,而不能为属性赋值。总体感觉来说Kotlin的反射机制用起来还是没有Java的灵活性高,总是会被那些新添加的语言特性束缚住。
猜你喜欢
- 2024-10-15 Java工具库——FastJson的40个常用方法
- 2024-10-15 SpringBoot返回Json(springboot返回json中文乱码)
- 2024-10-15 Hjson:JSON 的语法扩展(json语法结构)
- 2024-10-15 Python语法基础(14)JSON处理(python中json的用法)
- 2024-10-15 想学好Python,一定要掌握的基础模块之JSON
- 2024-10-15 java解析Json数据常用的两个解析库,实例分析
- 2024-10-15 IOS开发String字符串转JSON字典对象
- 2024-10-15 java中的注解:@SerializedName 和 @JsonProperty
- 2024-10-15 学习Python操作JSON,网络数据交换不用愁
- 2024-10-15 撸一个 JSON 解析器(json数据在线解析)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)