方法作为签名合同的参数?

时间:2011-05-01 19:26:31

标签: java reflection

我想知道如果方法具有参数本身,如何与调用者的Method参数创建一个契约。所以我用......

ClassA {
  String string_ = "HI";

  public static void subscribe(Object class, Method action) {
    action.invoke(class, string_);
  }
}

ClassB {

  ClassB() {
    ClassA.subscribe(this, this.getClass().getMethod("load", String.class));
  }

  public void load(String input) {
    if(input.equals("HI")) { 
      ... 
    }
  }
}

我想知道如何确保方法传递为“action”将String作为参数(即确保方法操作== load(String){})?有没有这样的东西:

public static void subscribe(Object class, Method action(String.class)) {

我想在subscribe的方法签名中这样做,这样调用类(ClassB)显然需要准备好接受指定类型的参数。

编辑:更新了最后一个代码位,因此不会显示为方法是通用的。使用<>的选择不佳就我而言,代表我试图传达的一个例子。

3 个答案:

答案 0 :(得分:2)

在Java中无法做到这一点。 Method类不是通用的,并且没有办法如此,因为方法可以使用任意数量的参数,并且无法在可变数量的类型上使类成为泛型。

您可以做的最好的事情是声明自己的类型而不是Method:

public interface Action<T, P> {
    public void invoke(T target, P parameter);
}

然后:

public static <T> void subscribe(T obj, Action<T, String> action) {
    action.invoke(obj, string_);
}

ClassB() {
    ClassA.subscribe(this, new Action<ClassB, String>() {
        public void invoke(ClassB target, String parameter) {
            target.load(parameter);
        }
    });
}

答案 1 :(得分:1)

在C#中有一些方法可以实现你想要做的事情,但我想不出一种方法来确保在java的编译时。

你可以使用接口吗?

interface ILoader{
   void load(String input);
}

ClassA {
  String string_ = "HI";

  public static void subscribe(ILoader loader) {
    loader.load( string_);
  }
}

ClassB implements ILoader {

  ClassB() {
    ClassA.subscribe(this);
  }

  public void load(String input) {
    if(input.equals("HI")) { 
      ... 
    }
  }
}

答案 2 :(得分:1)

你难道不能对Command Pattern进行轻微修改吗?

puclic interface LoadCommand {
  public load(String input);
}

public class ClassB implements LoadCommand {
  public load(String input) {
    // do stuff here
  }
}

public class ClassA {

  String myInput = "HI";

  public static void subscribe(LoadCommand command) {
    command.load(myInput)
  }
}

load接口中的LoadCommand方法需要一个String参数。