如何解决如何从对象获取字段
我有课:
public class resultJTO extends HashMap<String,Object> {
private static final long serialVersionUID = 1L;
}
我想获取此Hashmap的特定字段。我的意思是我正在上resultJTO
Object airport = resultJTO.get("AIRPORT");
我正试图通过这种方式做到这一点:
Object airport = resultJTO.get("AIRPORT");
Field field = searchJTO.class.getDeclaredField("city");
field.setAccessible(true);
field.get(airport);
但是得到
ava.lang.IllegalArgumentException: Can not set java.lang.String field AirportSearchJTO.city to java.util.HashSet
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:393)
at SearchServiceTest.shouldReturnProperMergedAirportIfAvailableInBothSources(SearchServiceTest.java:191)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.mockito.internal.runners.DefaultInternalRunner$1$1.evaluate(DefaultInternalRunner.java:44)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:74)
at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:80)
at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
我应该怎么做来获取例如城市?
解决方法
检查错误消息。它说:不能将java.lang.String字段pl.azimuthit.flightmap.service.module.search.jto.AirportSearchJTO.city设置为java.util.HashSet 。因此,它尝试将字符串类型的字段设置为 HashSet 的值。这不仅与错误的类型有关,而且还与您认为的有所不同-它不是关于获取的值,而是设置的值。因此,堆栈跟踪显示的内容与您想象的有所不同。
现在检查以下行: at pl.azimuthit.flightmap.service.module.search.SearchServiceTest.shouldReturnProperMergedAirportIfAvailableInBothSources(SearchServiceTest.java:191)
打开您的SearchServiceTest.java
类,转到第191行,查看其中的内容。这就是此堆栈跟踪的原因。再说一次:它设置值,而不是获取。
您的searchResultJTO对象将AirportSearchJTO的HashSet作为值,并将String作为键。 您需要像这样循环访问值
Object airportCollection = searchResultJTO.get("AIRPORT");
Field field = AirportSearchJTO.class.getDeclaredField("city");
field.setAccessible(true);
if (airportCollection instanceof Collection) {
for(Object airport : (Collection)airportCollection){
field.get(airport);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。