Java 如何调用以方法作为参数的方法?

Java 如何调用以方法作为参数的方法?,java,methods,Java,Methods,下面是我的一段代码:(我试图用它做的是:在我的主类中定义一个方法“renamingrule”,实例化我的另一个类“renamescript”的实例,并调用其作为参数传递的rename方法“renamingrule”我在主类中定义了方法。RenamScript类中一切正常,没有错误,但我不知道如何从我的主类/方法调用脚本类的rename方法。谢谢) 您可以通过Class.getMethod方法获得方法对象。大概是这样的: RenameScript2.class.getMethod("rename"

下面是我的一段代码:(我试图用它做的是:在我的主类中定义一个方法“renamingrule”,实例化我的另一个类“renamescript”的实例,并调用其作为参数传递的rename方法“renamingrule”我在主类中定义了方法。RenamScript类中一切正常,没有错误,但我不知道如何从我的主类/方法调用脚本类的rename方法。谢谢)


您可以通过
Class.getMethod
方法获得
方法
对象。大概是这样的:

RenameScript2.class.getMethod("rename", parameters);
public void rename(RenameAction action) {
    action.performRename();
}

但是,我建议您考虑编写一个可以执行重命名的类的接口,而不是通过<代码>方法< /代码> .< 这样的接口可能看起来像

interface RenameAction {
    void performRename();
}
要将脚本包装到
rename动作
对象中,请执行以下操作

RenameAction action = new RenameAction() {
    void performRename() {
        // ...
        String command = "cmd /c rename "+_path+"\\"+"\""+next_file+"\" "...
        p = Runtime.getRuntime().exec(command);
        // ...
    }
};
然后,您只需这样做:

RenameScript2.class.getMethod("rename", parameters);
public void rename(RenameAction action) {
    action.performRename();
}

您可以通过
Class.getMethod
方法获得
方法
对象。大概是这样的:

RenameScript2.class.getMethod("rename", parameters);
public void rename(RenameAction action) {
    action.performRename();
}

但是,我建议您考虑编写一个可以执行重命名的类的接口,而不是通过<代码>方法< /代码> .< 这样的接口可能看起来像

interface RenameAction {
    void performRename();
}
要将脚本包装到
rename动作
对象中,请执行以下操作

RenameAction action = new RenameAction() {
    void performRename() {
        // ...
        String command = "cmd /c rename "+_path+"\\"+"\""+next_file+"\" "...
        p = Runtime.getRuntime().exec(command);
        // ...
    }
};
然后,您只需这样做:

RenameScript2.class.getMethod("rename", parameters);
public void rename(RenameAction action) {
    action.performRename();
}

首先,aioobe绝对正确,传递方法对象有点难看。我想你一定是被困在里面了

要获得方法,您需要使用。下面的代码获取类
Integer
上名为
toString
的方法。然后调用
toString
方法

Method method = Integer.class.getMethod("toString");
Object o = method.invoke(new Integer(7));
System.out.println(o);
静态方法不需要将第一个参数传递给
method.invoke

Method method = File.class.getMethod("listRoots");
System.out.println(method.invoke(null));

这说明了你不应该使用它的原因。字符串“toString”和“listRoots”是不可重构的。如果有人重命名一个方法,那么将抛出一个运行时异常,而不是编译时错误(因此需要捕获异常,
NoSuchMethodException
IllegalAccessException
)。使用反射也比使用普通代码慢得多。

首先,aioobe绝对正确,传递方法对象有点难看。我想你一定是被困在里面了

要获得方法,您需要使用。下面的代码获取类
Integer
上名为
toString
的方法。然后调用
toString
方法

Method method = Integer.class.getMethod("toString");
Object o = method.invoke(new Integer(7));
System.out.println(o);
静态方法不需要将第一个参数传递给
method.invoke

Method method = File.class.getMethod("listRoots");
System.out.println(method.invoke(null));

这说明了你不应该使用它的原因。字符串“toString”和“listRoots”是不可重构的。如果有人重命名一个方法,那么将抛出一个运行时异常,而不是编译时错误(因此需要捕获异常,
NoSuchMethodException
IllegalAccessException
)。使用反射也比使用普通代码慢得多。

以下是您应该做的:

  • 通过添加抽象方法使类
    RenameScript2
    抽象
    publicstaticstringrenamingrule(字符串输入,int文件行)
  • 然后让主类
    RenameScriptMain2
    扩展到类
    RenameScript2
    之上,并提供方法
    RenamingRule()
    的实现
  • 现在在
    main
    method中创建类的实例
    RenameScriptMain2
    并调用方法
    RenamingRule()

  • 以下是您应该如何做:

  • 通过添加抽象方法使类
    RenameScript2
    抽象
    publicstaticstringrenamingrule(字符串输入,int文件行)
  • 然后让主类
    RenameScriptMain2
    扩展到类
    RenameScript2
    之上,并提供方法
    RenamingRule()
    的实现
  • 现在在
    main
    method中创建类的实例
    RenameScriptMain2
    并调用方法
    RenamingRule()