如何在java中动态传递方法名称

时间:2014-03-15 04:26:18

标签: java reflection

我有一个类如下

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;
}

我为每个参数使用了不同的方法来找出对象。有什么方法可以动态传递方法名吗?

提前致谢...

5 个答案:

答案 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 BeanUtilsBeanWrapper类。

答案 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