java - 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 代码片段中获取变量呢?
解决方案
首先,Serializer
package 下没有这个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);
或者使用自动getter
final Method uuid = dog.getClass().getMethod("uuid_");
final Object o = uuid_.invoke(dog);
推荐阅读
- angular - 在 TypeScript 中展平数组数组
- java - 如何以编程方式组合或合并android中的两个互联网连接?
- php - 使用 Google Cloud Storage 下载时权限被拒绝
- windows-installer - 发布软件并为其创建安装程序的“正确”方式
- python - 迁移引用动态存储不一致
- c# - 向天蓝色表插入语句的异常
- node.js - 使用 amqplib-mocks 库进行 rabbitMQ 单元测试
- reactjs - React Typescript:排除高阶组件中的属性
- sql-server - 在 SQL 中更改现有表上的文件流文件组
- php - 没有错误,但数据未显示,卡在处理中