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