java - 获取字段名称作为已定义类的字符串。那可能吗?
问题描述
使用 byte-buddy 可以将字段名称引用为字符串。这是我正在尝试的。
public class MyClass {
public int x;
public int y;
}
public String getMethodName() {
Class clazz = MyClass.class;
return clazz.getFields()[0].getName();
}
在这里,我不会每次都在位置 [0] 处获得字段 x,因此不能依赖它。
我以前没有使用过 byte-buddy。我在这里搜索了与 byte-buddy 相关的问题,也在文档中搜索过,但没有找到这种特殊类型的示例。
解决方案
有点不清楚你想要什么,但我最好的猜测是你指的是反射。
反射得名于代码“在镜子中看它的反射”的想法,即代码看自己。Java 反射 API 非常强大,它允许您完成使用其他技术不可能完成的事情,但它有很大的缺点。
例如:
public class MyClass {
public int x;
}
public String getMethodName() {
Class clazz = MyClass.class;
return clazz.getFields()[0];
}
public void setField(int newValue) {
Class clazz = MyClass.class;
clazz.getFields()[0].setInt(newValue);
}
上面的代码: - 定义了一个基本类 - 提供了一个方法来获取第一个字段的名称 - 提供了一个方法来设置这个字段的值。
这似乎是你要问的。
但是,使用反射有严重的缺点。
- 它非常慢,最多慢 1000 倍,因为 JVM 无法进行优化,因为它在编译时处理的数据信息较少。
- 它引入了非常讨厌的错误的可能性。一旦你打开这个蠕虫罐,你就不能再自信地对你的代码做出你以前所做的假设。如果你的类有一个没有设置器的私有变量,你可能会假设它的值不能改变。使用反射,它可以。
- 它忽略了 Java 的类型检查系统。这是上面提到的缓慢的原因之一,因为类型检查必须在运行时而不是编译时完成。然而,它也让你再次以一种主要的方式出现类型错误,Java 的类型系统试图将你从这一切中拯救出来。
正因为如此,只有在没有其他选择的情况下才应该使用反射,例如,制作 Json 解析库、编写 ORM 系统等。在其他情况下,我发现通常看起来是反射问题的问题实际上是抽象问题。
或许,如果不是通过String
名称获取字段,您可以创建一个使用名为ContainsMyField
的方法调用的接口getMyField()
,并且您希望拥有此字段的任何类都应实现此接口。此选项更清洁、更快、更安全。
推荐阅读
- python - 如何从字符串列表中删除 \uXXXX?
- python - Andrew Ng 使用 python 的 ML 课程练习:梯度下降
- r - 根据事务是否至少包含 R 中时间范围的一部分来提取数据子集
- c - 无法使用 esp32 从 firebase 获取正确的数据。每次我使用get函数时,串口监视器的输出都是0
- python - 将字符串转换为数据框中列内的整数(5 星级 = 5)
- java - 仅插入小数位时如何阻止应用程序崩溃
- java - Java没有从列表中删除特定项目
- elasticsearch - Elasticsearch:如果任何嵌套对象字段与术语值匹配,则不返回文档
- python - 有没有办法在 Tkinter 文本小部件的插入点获取行号?
- linux - 为什么有时 init 进程读取 /dev/initctl 返回 -1?