Kotlin 如何从类实例生成数据类

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的新

我在一个JSON文件中有一些配置值,我想通过gson将其解析为一个数据类。我想根据创建的数据类生成一个新类,其中的值是最终值。 这一切都应该发生在我的CI管道中,然后在我的应用程序运行时使用生成的类

要澄清的简单示例:

我有这个数据类

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中的默认值。你到底在找什么,还没有?