Scala 扩展特征字段未找到

我有一个具有默认值的公共 UUID 的 scala 特征:


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_

并且堆栈跟踪点与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 代码片段中获取变量呢?


慕侠2389804
浏览 101回答 1
1回答

潇湘沐

首先,Serializerpackage 下没有这个java.util,所以你使用的是别的东西。Antrait被翻译成 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);或者使用自动getterfinal Method uuid = dog.getClass().getMethod("uuid_");final Object o = uuid_.invoke(dog);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java