有没有一种很好的方法可以转换Scala case class实例,例如
case class MyClass(param1: String, param2: String)
val x = MyClass("hello", "world")
Run Code Online (Sandbox Code Playgroud)
进入某种映射,例如
getCCParams(x) returns "param1" -> "hello", "param2" -> "world"
Run Code Online (Sandbox Code Playgroud)
适用于任何案例类,而不仅仅是预定义的类.我发现你可以通过编写一个询问底层Product类的方法来拉出case类名,例如
def getCCName(caseobj: Product) = caseobj.productPrefix
getCCName(x) returns "MyClass"
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找类似的解决方案,但对于案例类字段.我想象一个解决方案可能不得不使用Java反射,但是如果案例类的底层实现发生变化,我讨厌在未来的Scala版本中编写一些内容.
目前我正在使用Scala服务器并使用案例类定义协议及其所有消息和异常,因为它们是如此美观,简洁的构造.但是,我需要将它们转换为Java映射,以通过消息传递层发送以供任何客户端实现使用.我当前的实现只是分别为每个案例类定义一个翻译,但是找到一个通用的解决方案会很好.
使用Java类上的反射来访问所有字段,方法等:
这些元素是否有标准化顺序(在某些标准中指定)?
当然,我可以凭经验检查,但我需要知道它是否总是一样的.
编辑:
我等待的问题:我需要的订单;)
长话短说:我有JAXB注释类,并且不希望在视觉上代表这些类.虽然XML属性的顺序既不与XML标准相关,也不与JAXB相关,但我希望对可视表示具有特定顺序的XML属性.
例如:开始结束.这伤害了一个人的直觉.
情况似乎是异常的,但我被要求构建序列化器,它将通过连接"get"方法的结果将对象解析为字符串.值应与源代码文件中声明的"get"等效值的顺序相同.
所以,例如,我们有
Class testBean1{
public String getValue1(){
return "value1";
}
public String getValue2(){
return "value2";
}
}
Run Code Online (Sandbox Code Playgroud)
结果应该是:
"value1 - value2"
Run Code Online (Sandbox Code Playgroud)
不是
"value2 - value1"
Run Code Online (Sandbox Code Playgroud)
Class根据文档,它不能用对象完成.但是我想知道我是否可以在"*.class"文件中找到这些信息还是丢失了?如果存在这样的数据,也许有人知道为此目的准备使用的工具?如果无法找到此类信息,请提出最专业的实现目标的方法.我想为应该序列化的类的getter添加某种自定义注释.
假设有以下简单的示例数据类:
data class SomeDataClass(
var id: String,
var name: String,
var deleted: String
)
Run Code Online (Sandbox Code Playgroud)
使用以下代码可以获取属性(并设置或获取它们的值):
import kotlin.reflect.full.memberProperties
val properties = SomeDataClass::class.memberProperties
print(properties.map { it.name }) // prints: [deleted, id, name]
Run Code Online (Sandbox Code Playgroud)
print 语句中的映射将返回一个列表,其中包含按字母顺序排列的属性名称。我需要按照源代码中定义的顺序列出列表,在本例中为:[id、name、deleted]。
单纯通过反思似乎无法实现。我能想到的唯一解决方案是使用定义顺序的辅助类:
val SomeDataClass_Order = listOf("id", "name", "deleted")
Run Code Online (Sandbox Code Playgroud)
对于一两个类来说这不是问题,但对于数百个数据类来说却是个问题,其中最大的一个数据类多达近一百个属性。
任何想法都会受到欢迎。我不需要详细的代码,而是需要提示(比如解析源代码、注释等)。
假设我有这门课
是否可以按顺序采用getters方法?
public class ClassA {
private String name;
private Integer number;
private Boolean bool;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public Boolean getBool() {
return bool;
}
public void setBool(Boolean bool) {
this.bool = bool;
}
Run Code Online (Sandbox Code Playgroud)
}
我试过这个..
for (Method method : ClassA.class.getDeclaredMethods()) {
if (!(method.getReturnType().toString().equals("void"))) {
method.invoke(obj, new Object[0]))); …Run Code Online (Sandbox Code Playgroud) Class.getDeclaredFields()那个文档上说
返回数组中的元素未排序,并且不按任何特定顺序。
但我发现结果实际上是按完美的字母顺序而不是声明顺序排序的。发生什么了?我的JDK版本是1.8。
PS:我想知道这一点,因为我现在正在实现一种依赖于声明字段的声明顺序的对象序列化方式,这种方式不受代码混淆的影响。有更好的主意吗?
我知道以下不是一个好的设计,但这是我需要解决的问题
public final class TestBean {
private String field1;
private String field2;
private String field3;
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
public String getField3() {
return field3;
}
public void setField3(String field3) {
this.field3 = field3;
}
}
Run Code Online (Sandbox Code Playgroud)
并且需要动态填充类中的字段.
假设我有一个数组{"abc","def"},该类应该以field1 ="abc",field2 ="def"和field3 =""开始; 如果数组是{"a"}并且field1 ="a",则field2 ="",field3 ="".
是否有可能实现这一目标?
更新:显然我没有说好问题.实际上,该字段不仅仅是三个,它是从字段1,字段2到字段15.然后它不仅仅是一个字段,还有另一个字段调用,例如名称,从名称1到名称15:
public final class TestBean { …Run Code Online (Sandbox Code Playgroud)