检查字段名称对应的字符串参数

时间:2016-02-24 15:06:09

标签: java eclipse

我大量使用Java.lang.Class.getField()方法,该方法需要String变量作为参数。我面临的问题是,当我更改getField()引用的字段名称时,Eclipse不会警告我参数无处可寻(因为它是String)并且我最终导致方法不正常地被忽视

到目前为止,我可以看到两种方法。它要么在每个try-catch调用周围使用getField()块,要么运行应用程序以查看抛出异常的下一行是什么。修复它并注意下一个异常。或者每当我更改字段名称以手动查找字符串值并替换它时,它都使用“查找/替换”功能。在这种情况下是否有更友好(即自动)的方式来更新String参数?

也许有一个方法(我找不到)接受一个完整的字段路径作为非String参数并返回一个Field对象?类似turnToFieldObject(car.speed)返回Field对象speed字段的对象,以便Eclipse自动检查是否存在这样的字段car.speed

PS

首先,感谢您的回复。

我可以看到很多人,伙计们,我建议我过多地使用反射。这就是为什么我觉得我需要添加额外的解释,并且很高兴听到建议。

我正在进行有关社交进化建模的研究,我需要实体来开发他们一开始没有的新功能。在我看来,添加新字段来表示一些进化变化比向数组或集合添加新元素更明智。并且任务表明我不应该知道将演变哪些功能。这就是为什么我如此依赖反思。

2 个答案:

答案 0 :(得分:3)

AFAIK,没有这样的方法。你传递一个引用(如果它是一个对象)或值(如果它是原始的);有关它们最初分配给它们的变量的所有数据在运行时都不可用。

这是使用反射的巨大缺点,如果你重新使用反思"以这种方式使用此功能,您可能做错了什么。为什么不使用getter和setter直接访问该字段?

不要误解我的意思,反射有其用途(例如,当您想要扫描具有特定注释的字段并注入其值时),但是如果您按名称引用字段或方法使用简单的字符串,您也可以直接访问字段或方法。这意味着你事先知道了这个领域。如果它是私有的,可能有其原因被封装起来。您过度使用反射会失去内容辅助和重构可能性。

如果你建模社交进化,我会选择更灵活的解决方案。在运行时添加新字段(接近?)是不可能的,因此您基本上不得不为每个实体实现一个新类,并在每次实体发展时创建一个新对象#34;。这就是为什么我建议你采用其中一种解决方案的原因:

  • 使用 <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.1-1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-base</artifactId> <version>2.7.1</version> </dependency> 存储实体&#39;属性。这是一个非常灵活的解决方案,可以让您轻松添加和删除&#34;字段&#34;以丢失类型数据为代价。检查实体是否具有某个属性将是一个便宜的Map<String, Object>电话。

  • 如果你真的想要坚持百万个自定义类,除了字段之外还要使用带有getter和setter的接口。例如,将contains转换为private String name。这更容易重构,不依赖于反射。类可以根据需要实现任意数量的接口,因此这非常类似于字段解决方案,除非它允许您在需要时创建具有额外逻辑的自定义getter / setter。并且确定实体是否具有某个属性是interface Named { String getName(); void setName(String name); }调用,这仍然比反射便宜。

答案 1 :(得分:-1)

我建议编写一个方法,用于让你的字段为它提供一个字符串然后如果抛出异常,通知任何需要通知它无效并且如果异常没有被捕获则返回该字段。

虽然我同意上述内容,但不应大量使用反射。