Kotlin 如何从类实例生成数据类
我在一个JSON文件中有一些配置值,我想通过gson将其解析为一个数据类。我想根据创建的数据类生成一个新类,其中的值是最终值。 这一切都应该发生在我的CI管道中,然后在我的应用程序运行时使用生成的类 要澄清的简单示例: 我有这个数据类Kotlin 如何从类实例生成数据类,kotlin,code-generation,data-class,Kotlin,Code Generation,Data Class,我在一个JSON文件中有一些配置值,我想通过gson将其解析为一个数据类。我想根据创建的数据类生成一个新类,其中的值是最终值。 这一切都应该发生在我的CI管道中,然后在我的应用程序运行时使用生成的类 要澄清的简单示例: 我有这个数据类 data class MyDataClass(val name:String, val age:Int) 通过解析(gson)创建了这样的实例 MyDataClass("john", 42) 有没有一种方法可以基于MyDataClass的新
data class MyDataClass(val name:String, val age:Int)
通过解析(gson)创建了这样的实例
MyDataClass("john", 42)
有没有一种方法可以基于MyDataClass的新实例创建(数据)类,从而创建类似的内容
class MyDataClassFinal{
val name = "john"
val age = 42
}
我在一个json文件中有一些配置值,我想通过gson解析到一个数据类。我想根据创建的数据类生成一个新类,其中的值是最终值
你在这里没什么可做的。正如您所描述的,数据类是最终的。它不是open
,因此类是final,字段是val
s,并且仅通过构造函数设置,因此它们不能更改,因此它们也是final
通过搜索“Actions”,查找Kotlin字节码
,然后点击反编译
查看Java源代码,可以看到类的Java等价物。看起来是这样的:
@Metadata(
mv = {1, 1, 18},
bv = {1, 0, 3},
k = 1,
d1 = {"\u0000 \n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010\b\n\u0002\b\t\n\u0002\u0010\u000b\n\u0002\b\u0004\b\u0086\b\u0018\u00002\u00020\u0001B\u0015\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006J\t\u0010\u000b\u001a\u00020\u0003HÆ\u0003J\t\u0010\f\u001a\u00020\u0005HÆ\u0003J\u001d\u0010\r\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\b\b\u0002\u0010\u0004\u001a\u00020\u0005HÆ\u0001J\u0013\u0010\u000e\u001a\u00020\u000f2\b\u0010\u0010\u001a\u0004\u0018\u00010\u0001HÖ\u0003J\t\u0010\u0011\u001a\u00020\u0005HÖ\u0001J\t\u0010\u0012\u001a\u00020\u0003HÖ\u0001R\u0011\u0010\u0004\u001a\u00020\u0005¢\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\t\u0010\n¨\u0006\u0013"},
d2 = {"Lcore/lib/extensions/MyDataClass;", "", "name", "", "age", "", "(Ljava/lang/String;I)V", "getAge", "()I", "getName", "()Ljava/lang/String;", "component1", "component2", "copy", "equals", "", "other", "hashCode", "toString", "treking-android.dominicore-android"}
)
public final class MyDataClass {
@NotNull
private final String name;
private final int age;
@NotNull
public final String getName() {
return this.name;
}
public final int getAge() {
return this.age;
}
public MyDataClass(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.age = age;
}
@NotNull
public final String component1() {
return this.name;
}
public final int component2() {
return this.age;
}
@NotNull
public final MyDataClass copy(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
return new MyDataClass(name, age);
}
// $FF: synthetic method
public static MyDataClass copy$default(MyDataClass var0, String var1, int var2, int var3, Object var4) {
if ((var3 & 1) != 0) {
var1 = var0.name;
}
if ((var3 & 2) != 0) {
var2 = var0.age;
}
return var0.copy(var1, var2);
}
@NotNull
public String toString() {
return "MyDataClass(name=" + this.name + ", age=" + this.age + ")";
}
public int hashCode() {
String var10000 = this.name;
return (var10000 != null ? var10000.hashCode() : 0) * 31 + this.age;
}
public boolean equals(@Nullable Object var1) {
if (this != var1) {
if (var1 instanceof MyDataClass) {
MyDataClass var2 = (MyDataClass)var1;
if (Intrinsics.areEqual(this.name, var2.name) && this.age == var2.age) {
return true;
}
}
return false;
} else {
return true;
}
}
}
如您所见,类、它的字段以及它们的访问器都是final
使用.copy()
,只修改需要修改的参数。例如:
val joe = MyDataClass(“Joe”, 42)
val mary = joe.copy(name = “Mary”) // age is 42
谢谢你的回复。不,我不寻找默认参数。我想根据实例中的值创建一个完整的新类(也是一个新类文件)。从具有相同数据的现有类文件创建一个新类文件有什么用?我更新了我的问题。生成和使用处于应用程序的不同阶段。生成是通过CI构建运行的,使用是在运行应用程序时进行的。我更新了答案。我更新了问题,可能没有。我想说的更清楚:)是否要定义一个新的、不同于MyDataClass的类?不确定,因为您给了它相同的名称,并且它具有相同的属性,所以我不知道为什么它应该是一个不同的类。您的初始数据类已经是“final”,并且它的属性也是。这是Kotlin中的默认值。你到底在找什么,还没有?