我有这个奇怪的案例,如果可能的话,我想通过反思或某些库来处理.有没有办法检查一个类是否有一个方法,然后在已经存在的对象实例上调用它?
例如,假设我有:
Foo foo = new Foo();
Run Code Online (Sandbox Code Playgroud)
Foo有一个close()方法.让我们说我知道很多类都有一个close()方法,但由于它们设计很差并且是我无法重写的遗留物,我想找到一个通用的解决方案来调用我知道它们都有的方法,尽管它们不是从基类或接口继承的.
我想在我的FooHandling类中有一个接受初始化对象并调用其close()方法的方法.对象绝不会继承自同一个基类,因此它们本质上完全不同,但它们都有一个同名的方法.所以,FooHandler我希望有这样的东西:
void coolGenericClosingMethod(Object o)
{
// 1) Check via reflection if the class `o` represents contains a `close()`
// 2) Invoke the method, if it exists, but on the passed in object `o`.
}
Run Code Online (Sandbox Code Playgroud)
那么我可以在已经实例化的对象上使用一些巧妙的技巧并仍然这样做吗?
有没有办法检查一个类是否有方法
返回一个包含Method对象的数组,这些对象反映
public此Class对象所表示的类或接口的所有成员方法,包括由类或接口声明的那些以及从超类和超接口继承的那些
返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定公共成员方法.该
name参数是一个String,指定简单名称the desired method.
抛出:
NoSuchMethodException - 如果找不到匹配的方法
示例代码:
class Foo {
public void close() {
System.out.println("close method is invoked");
}
}
Foo foo = new Foo();
try {
Method m = Foo.class.getMethod("close");
m.invoke(foo);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
输出:
close method is invoked
Run Code Online (Sandbox Code Playgroud)