Java 如何以字符串形式获取属性的名称?
我有一个类Java 如何以字符串形式获取属性的名称?,java,Java,我有一个类Car,它有一个名为trunk的字段。如何仅使用分配给该名称的属性检索该名称,而不使用任何固定的字符串。 像这样的小说会很棒: System.out.println(new Car().getTrunk().getField().getName()); 输出: trunk 我不想使用一个固定的字符串来检索字段及其名称,因为这不会很好地重构。如果我决定从trunk重命名为boot,我希望IDE的重构工具能够完全处理这个问题 更新Carclass: public class Car{
Car
,它有一个名为trunk
的字段。如何仅使用分配给该名称的属性检索该名称,而不使用任何固定的字符串
。
像这样的小说会很棒:
System.out.println(new Car().getTrunk().getField().getName());
输出:
trunk
我不想使用一个固定的字符串
来检索字段及其名称,因为这不会很好地重构。如果我决定从trunk
重命名为boot
,我希望IDE的重构工具能够完全处理这个问题
更新Car
class:
public class Car{
String trunk;
// getters + setters
}
背景:
我想为几个实体使用CRUD-UI,这些实体使用列模板
,其中包含字段
s/属性的名称,这些属性将由表达式语言
评估。例如,考虑引入一个包含所有属性(无值)的枚举
enum CarProperty {
TRUNK, HOOD, WHATEVER;
}
并将其作为地图存储在车内:
class Car {
private Map<CarProperty, String> propsToValues = new EnumMap<>(...);
public String getValue(CarProperty property) { ... }
}
显然重构很容易访问属性名不是一个好主意。
通过反射,您正在违反OOP原则
GetRunk()并非总是需要访问trunk属性
你可以喝一杯
private Trunk trunk;//remember to change the TRUNK_FIELD
public static final TRUNK_FIELD = "trunk"
但是。。。尽量避免使用此解决方案。查找反射。在我看来,属性名称是“trunk”。你知道的,因为你说“getTrunk”。你怎么可能不知道酒店的名称,但仍然能够引用它呢?我怀疑你没有正确处理你的问题。你能解释一下你为什么需要这个吗?当前的IDE已经很好地处理了很多重构问题,尤其是重命名字段。如果您决定将trunk
重命名为boot
,将其设置为字符串将防止IDE在重构时注意到它。你想通过这样做实现什么?谢谢你的努力。但这确实是一个丑陋的解决办法。想象一下,在一个实际的项目中,有很多类可以使用它。@Lester同意,但正如omarhry所说,你想做的是打破OOP原则,这总是很难看。@Lester顺便说一句,如果你使用Intellij Idea重构代码,它会建议你更新getter和setter以及其他相关代码。也许这会有帮助。什么OOP原则被打破了?我用它来减少诸如getter和setter之类的样板代码,这是一个很好的工具。谢谢你的回答,但我看不出这将如何很好地进行重构。编辑:使用公共TRUNK_字段,重构TRUNK变量时,也要更改“TRUNK”。这不能解决你的问题吗?
private Trunk trunk;//remember to change the TRUNK_FIELD
public static final TRUNK_FIELD = "trunk"