如何在Android中将方法作为参数传递

时间:2017-01-12 11:14:24

标签: java android methods location

这可能是一个非常愚蠢的问题,甚至是不可能的。

我不确定这是否会被称为方法,但是这样做。我怎样才能传递getCountryName();作为参数?如下图所示;

public static String Utils(Something something){
    Geocoder geoCoder = new Geocoder(context, Locale.getDefault());
    List<Address> address = null;

    if (geoCoder != null) {
        try {
            address = geoCoder.getFromLocation(lat, lng, 1);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        if (address.size() > 0) {
            return address.get(0).getCountryName(); // pass this as parameter (something)
        }
    }
    return null;
}

然后像这样调用它,

Utils(getCountryName());
Utils(getCountryCode());
etc.

5 个答案:

答案 0 :(得分:2)

This Answer帮助我做到了。您也可以尝试。

  

方法不是Java中的一流对象,因此它们不能作为参数传递。您可以将您的方法调用包装在扩展例如Runnable界面。

答案 1 :(得分:1)

您可以使用反射。

e.g。

Method[] methods = Address.class.getMethods();
for (Method method : methods){
    if(method.getName().equals(param)){
        return (String) method.invoke(address.get(0));
    }
}

param的类型为String,其值为您要调用的方法。

编辑:完整示例,使用getMethod(String)

public static String Utils(String param){
    Geocoder geoCoder = new Geocoder(context, Locale.getDefault());
    List<Address> address = null;

    if (geoCoder != null) {
        try { 
            address = geoCoder.getFromLocation(lat, lng, 1);
        } catch (IOException e1) {
            e1.printStackTrace();
        } 
        if (address.size() > 0) {
            Method method = Address.class.getMethod(param);
            if(method == null) return null;
            try{
                return (String) method.invoke(address.get(0));
            }catch(ReflectiveOperationException e){
                // Expected param maybe?
                return null;
            }
        } 
    } 
    return null; 
} 

答案 2 :(得分:0)

在java中,这是您最终使用的语言。您不能将方法或函数作为参数传递给函数。如果您能够使用它,那么从Java 8开始,lambda表达式就是一种“匿名”函数。试试吧。

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

在这个SO答案中,你有一个非常详细的指南。 Java Pass Method as Parameter

在该线程中,如果您不能使用java8

,则会有更多关于某些模式的信息

答案 3 :(得分:0)

试试这个;

首先使用您要作为参数传递的方法定义一个接口

public interface Callable {
  public void getCountryName();
  public void getCountryCode();
}

使用方法

实现一个类
class Method_passing implements Callable {
  public void getCountryName() {
     //do your task
  }

  public void getCountryCode() {
     //do your task
  }
}

像这样调用

Callable cmd = new Method_passing();
//This allows you to pass cmd as parameter and invoke the method call defined in the interface

public invoke( Callable callable ) {
  cmd.getCountryName(); //return name etc..
  cmd.getCountryCode();
}

答案 4 :(得分:0)

您可以在地址类中实现getUtil函数,然后使用标识符来执行您选择的函数。

public class Address {
public static final int GET_COUNTRY_NAME = 1;
public static final int GET_COUNTRY_CODE = 2;

public String getUtil(int code){
    switch(code){
    case GET_COUNTRY_NAME: return this.getCountryName();
    case GET_COUNTRY_CODE: return this.getCountryCode();
    default: return null;
    }
}

private String getCountryName(){
    //do something
    return "";
}

private String getCountryCode(){
    //do something
    return "";
}}

然后定义你的函数,如

public static String Utils(int something){
Geocoder geoCoder = new Geocoder(context, Locale.getDefault());
List<Address> address = null;

if (geoCoder != null) {
    try {
        address = geoCoder.getFromLocation(lat, lng, 1);
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    if (address.size() > 0) {
        return address.get(0).getUtil(something);
    }
}
return null; }}

将使用

调用
Utils(Address.GET_COUNTRY_NAME);
Utils(Address.GET_COUNTRY_CODE);