向类中的每个方法添加方法调用
本文关键字:方法 添加 调用 | 更新日期: 2023-09-27 18:29:17
我有一个有很多方法的类:
public class A {
public string method1() {
return "method1";
}
public string method2() {
return "method2";
}
public string method3() {
return "method3";
}
.
.
.
public string methodN() {
return "methodN";
}
}
我想在每个方法中添加对doSomething()的调用,例如:
public string methodi() {
doSomething();
return "methodi";
}
最好的方法是什么?有合适的设计模式吗?
这是AOP(面向方面编程)的典型用例。您将定义方法调用的插入点,AOP引擎将正确的代码添加到类文件中。当您希望添加日志语句而不打乱源文件时,通常会使用此选项。
对于java,您可以添加aspectj库
对于C#和.NET,请查看此博客。看起来是个不错的开局。
使用AOP已经是一个很好的答案,这也是我的第一个想法。
我试图找到一个没有AOP的好方法,并提出了这个想法(使用Decorator模式):
interface I {
String method1();
String method2();
...
String methodN();
}
class IDoSomethingDecorator implements I {
private final I contents;
private final Runnable commonAction;
IDoSomethingDecorator(I decoratee, Runnable commonAction){
this.contents = decoratee;
this.commonAction = commonAction;
}
String methodi() {
this.commonAction().run();
return contents.methodi();
}
}
然后你可以装饰A的结构(实现I):
I a = new IDoSomethingDecorator(new A(),doSomething);
这基本上不是火箭科学,事实上会产生比你的第一个想法更多的代码,但你可以注入常见的动作,并将额外的动作从A类本身中分离出来。此外,您可以很容易地关闭它,或者只在测试中使用它,例如。
为什么没有一个函数?
public string methodi(int i) {
doSomething();
return "method" + i.toString();
}
或者,您可以编写一个接受Func参数的函数,并调用该函数而不是您的函数。
public string Wrapper(Func<string> action)
{
doSomething();
return action();
}
并从此函数调用您的函数;
string temp = Wrapper(method1);
您可以使用反射。
public String callMethod(int i) {
doSomething();
java.lang.reflect.Method method;
try {
method = this.getClass().getMethod("method" + i);
} catch (NoSuchMethodException e) {
// ...
}
String retVal = null;
try {
retVal = method.invoke();
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) { }
return retVal;
}