java - 方法作为带有签名合约的参数?

标签 java reflection

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

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 作为参数(即确保 Method action == load(String){})?有没有类似的东西:

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

我想在 subscribe 的方法签名中执行此操作,以便调用类(ClassB)很明显它需要准备接受指定类型的参数。

编辑:更新了最后一个代码位,以免显得方法是通用的。我使用 <> 来代表我试图传达的内容的示例是错误的选择。

最佳答案

在 Java 中没有办法做到这一点。 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);
        }
    });
}

关于java - 方法作为带有签名合约的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5850759/

相关文章:

java - 具有嵌套对象的对象的两个实例与动态比较(选项/规则/参数)

java - 查看对象是否是通过字符串传递的类的实例

scala - 使用新的反射API,如何找到类的主构造函数?

java - 无法使用 Reflection API 访问方法

Java项目找不到文件

c# - C#中如何通过反射获取属性值

java - 更改 JTextArea 中的文本选择类型

java - 具有自动过期元素的 map

java - 比较一个简单循环的 java 字节码?

java - Hibernate 和 Thymeleaf 无限递归