我有一个类如下
public class Test
{
private Long id;
private Long locationId;
private Long anotherId;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getLocationId() {
return locationId;
}
public void setLocationId(Long locationId) {
this.locationId = locationId;
}
public Long getAnotherId() {
return anotherId;
}
public void setAnotherId(Long anotherId) {
this.anotherId = anotherId;
}
}
我在各个地方使用了以下方法,通过id,locationId或anotherId
找到匹配的对象public Test getMatchedObject(List<Test> list,Long id )
{
for(Test vo : list)
if(vo.getId() != null && vo.getId().longValue() == id.longValue())
return vo;
}
public Test getMatchedLocationVO(List<Test> list,Long locationId )
{
for(Test vo : list)
if(vo.getLocationId() != null && vo.getLocationId().longValue() == locationId.longValue())
return vo;
}
public Test getMatchedAnotherVO(List<Test> list,Long anotherId )
{
for(Test vo : list)
if(vo.getAnotherId() != null && vo.getAnotherId().longValue() == anotherId.longValue())
return vo;
}
我为每个参数使用了不同的方法来找出对象。有什么方法可以动态传递方法名吗?
提前致谢...
答案 0 :(得分:4)
你需要使用反射来做到这一点。
import java.lang.reflect.*;
Method method = obj.getClass().getMethod(methodName);
然后使用method.invoke(obj, arg1, arg2);
这有点类似于javascript中调用的方式(如果你熟悉它),除了传递上下文之外,你传递的是对象及对它的引用。方法
答案 1 :(得分:2)
您可以使用反射执行此操作,但它可能不是原始问题的最佳解决方案,因为反射旨在供编程工具使用。您应该考虑使用其他工具,如多态和继承,它们可以提供类似的功能。
答案 2 :(得分:2)
虽然你是动态地调用方法,但它看起来像是反射,但据我所知,你正在调用访问器和嵌套访问器,这导致使用Java Introspection API。
它很容易支持Java Bean API,访问器/ mutator和嵌套访问器/ mutators。
还有其他一些库可以简化这一过程,例如Spring的Apache BeanUtils和BeanWrapper类。
答案 3 :(得分:0)
使用接口的可能解决方案..希望你明白这个想法..代码不一定编译。格式化的道歉,因为这只在iPad中输入。
public interface IdMatcher{
Long id;
public boolean matches(Test obj);
}
具体类:
public class LocationIdMatcher implements IdMatcher() {
public LocationIdMatcher(id) {
this.id = id;
}
public boolean matches(Test obj) {
if (obj.getLocationId() == this.id)
return true;
}
}
getMatchedVO已更新:
public Test getMatchedVO(List<Test> list, IdMatcher idMatcher) {
for(Test vo: list) {
if(idMatcher.matches(vo) {
return vo;
}
}
return null;
}
用法:
Test vo = getMatchedVO(list, new LocationIdMatcher(locationId));
答案 4 :(得分:0)
通过使用Reflection API,您可以执行此操作 see this example