获取已定义 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 无法通过这种方式获取名称作为字段的字符串。
使用 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 无法通过这种方式获取名称作为字段的字符串。