每次在特定 Java 类中调用任何方法时,我都想运行一些代码,但不想触及实际的方法主体。这是因为有很多方法经常更改,编写这些方法的人不必担心将我的代码添加到每个方法中......即使它只是调用另一个方法的一行。
我想不出一种通过继承来实现这一点的方法,所以我想知道反射是否可行?甚至根本没有?
可以获取类中的方法列表,检查它们的属性,甚至调用它们。但是我没有看到任何可以让您附加额外代码的东西,例如事件处理程序。也许Java是这样的错误语言..
每次在特定 Java 类中调用任何方法时,我都想运行一些代码,但不想触及实际的方法主体。这是因为有很多方法经常更改,编写这些方法的人不必担心将我的代码添加到每个方法中......即使它只是调用另一个方法的一行。
我想不出一种通过继承来实现这一点的方法,所以我想知道反射是否可行?甚至根本没有?
可以获取类中的方法列表,检查它们的属性,甚至调用它们。但是我没有看到任何可以让您附加额外代码的东西,例如事件处理程序。也许Java是这样的错误语言..
这是非常常见的行为,其中面向方面的编程绝对是正确的选择。
但我也对著名的 CMS 如何做到这一点印象深刻。
对于每个包含具体方法的类,您可以拥有一个属性(方法列表),其中包含您要在方法调用之前执行的代码。
您可以编写一个registerBeforeCall(Method m)
方法,该方法采用一个方法并添加到列表中。
您的方法应该在第一行包含一个 for 循环(遍历方法列表)并逐个调用每个方法。
如果调用中有任何异常,请不要忘记尝试并捕获并忽略异常。
例如:
public void myActualMethod(){
for(Method m : registeredMethodsToCallBeforeActualCode){
m.invoke();
}
//my actual code
// here you can also write a for loop to execute all the methods which you want to call after your actual code is executed.
}
这种方法不是很特别,但是在你不选择 AOP 的时候被广泛使用。
通过继承实现它的一种方法是:
public SuperClass {
public void doSomething() {
doBefore();
doSpecific();
doAfter();
}
protected abstract void doSpecific();
}
public SubClass extends SuperClass {
protected void doSpecific() {
System.out.println("Do specific implementation....");
}
}
public static void main(String[] args) {
SuperClass clazz = new SubClass();
clazz.doSomething();
}