找不到scala扩展特性字段

uxhixvfz  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(383)

我有一个scala特性,它的公共uuid有一个默认值:

trait pet {
    var uuid_ : UUID = UUID.randomUUID
}

现在我也在scala中创建了多个类:

class dog extends pet {
    var foo = 1
}
class cat extends pet {
}
class fish extends pet {
}

之后,我用java创建了一个方法(混合了两种语言的旧项目)。
这是我的问题。在变量中 somePet 是的示例 dog , cat 或者 fish . 但目前尚不清楚它们究竟是什么:

// printing all variables in the console for human testing
Serializer.printAllFields(somePet);

// The somePet Variable must be a pet
if(!pet.class.isAssignableFrom(somePet.getClass()))
    throw new Exception("Not a pet.");

// get the UUID of the pet
UUID uuid_;
try {
    Field f = pet.class.getField("uuid_");
    f.setAccessible(true);
    uuid_ = (UUID) f.get(somePet);
}catch(Exception e){
    // no uuid found
    throw e;
}

但当我运行代码时,会出现以下错误:

Exception in thread "main" java.lang.NoSuchFieldException: uuid_

和一行上的stacktrace点 Field f = pet.class.getField("uuid_"); .
但是代码有什么问题?
我认为另一种方法是将这一行替换为:

Field f = ntObj.getClass().getField("uuid_");

但这也失败了。
那么变量在哪里呢 uuid_ ?
因为当我在当前 somePet 通过一个序列化程序,我得到


* cat.uuid_ = 34d7a781-472d-4d98-861e-7cff08045445;


* dog.foo = 1
* dog.uuid_ = 34d7a781-472d-4d98-861e-7cff08045445;

在控制台里。
所以变量 uuid_ 是否有默认值。
(我正在使用本文中的序列化程序)
那我怎么才能拿到 uuid_ java代码段中的变量?

bvpmtnay

bvpmtnay1#

首先,不存在这样的问题 Serializer 在包裹下面 java.util ,所以你在用别的东西。
trait 被翻译成java interface ,它本身不能有字段。
但是你试图通过 Pet 接口

pet.class.getField(...)

那不行。你需要在混凝土里面找一块地 class .
此外,该领域将 private 默认情况下,由于访问是通过 getter .
这个 getField 方法能够检索 public 字段,而 getDeclaredField 能够检索 protected 以及 private 字段,但仅限于从哪个类调用。你还需要一个电话 setAccessible(true) ,因为
值true表示反射对象在使用时应禁止java语言访问检查。值false表示反射对象应该强制执行java语言访问检查
正确的代码是( dog 是具体示例)

final Field uuid = dog.getClass().getDeclaredField("uuid_");
uuid.setAccessible(true);
final Object o = uuid.get(dog);

或者使用自动 getter ```
final Method uuid = dog.getClass().getMethod("uuid_");
final Object o = uuid_.invoke(dog);

相关问题