首页 > 解决方案 > 获取字段名称作为已定义类的字符串。那可能吗?

问题描述

使用 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 相关的问题,也在文档中搜索过,但没有找到这种特殊类型的示例。

标签: javabyte-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(),并且您希望拥有此字段的任何类都应实现此接口。此选项更清洁、更快、更安全。


推荐阅读