获取已定义 class 的字段名称作为字符串。那可能吗?

Getting field name as string for already defined class. Is that possible?

使用 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 before.I 在这里搜索了与 byte-buddy 相关的问题,也在文档中搜索过,但没有找到这种特定类型的示例。

有点不清楚你想要什么,但我最好的猜测是你指的是 反射

反射得名于代码 "looks at its reflection in a mirror" 的想法,即代码看着自己。 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);
}

以上代码: - 定义了一个基本的 class - 提供获取第一个字段名称的方法 - 提供了一种方法来设置这个字段的值。

你问的好像是这个

但是,使用反射也有严重的缺点。

  • 非常慢,最多慢 1000 倍,因为 JVM 无法进行优化,因为它在编译时处理的数据信息较少.
  • 它引入了非常讨厌的错误的可能性。一旦你打开了这个蠕虫罐头,你就不能再像以前那样自信地对你的代码做出假设。如果你有一个 class 和一个没有 setter 的私有变量,你可能会认为它的值不能改变。使用反射,它可以。
  • 它忽略了Java的类型检查系统。这是上面提到的缓慢的原因之一,因为类型检查必须在运行时而不是编译时完成。然而,它也让你再次以主要方式输入错误,整个事情 Java 的类型系统试图将你从中拯救出来。

正因为如此,反射应该在确实没有其他选择的情况下使用,例如,制作Json解析库,编写ORM系统等.在其他情况下,我发现一般看似反射问题的问题其实都是抽象问题

或许,如果不是通过字段的 String 名称获取字段,您可以使用名为 getMyField() 的方法创建一个名为 ContainsMyField 的接口,以及任何 class你期望有这个字段应该实现这个接口。这个选项更干净、更快、更安全。

使用反射,Fields 无法通过这种方式获取名称作为字段的字符串。