Java 为类中的任何方法运行额外代码

Java 为类中的任何方法运行额外代码,java,reflection,Java,Reflection,每次在特定Java类中调用任何方法时,我都想运行一些代码,但不想触及实际的方法体。这是因为有很多方法经常更改,编写这些方法的人不必担心将我的代码添加到每个方法中。。即使只是一行调用另一个方法 我想不出用继承来实现这一点的方法,所以我想知道用反射是否可行?甚至是根本没有 可以获取类中的方法列表,检查它们的属性,甚至调用它们。但我没有看到任何允许附加额外代码的东西,例如事件处理程序。也许Java对于这样的东西是错误的语言。通过继承实现它的一种方法是: public SuperClass {

每次在特定Java类中调用任何方法时,我都想运行一些代码,但不想触及实际的方法体。这是因为有很多方法经常更改,编写这些方法的人不必担心将我的代码添加到每个方法中。。即使只是一行调用另一个方法

我想不出用继承来实现这一点的方法,所以我想知道用反射是否可行?甚至是根本没有


可以获取类中的方法列表,检查它们的属性,甚至调用它们。但我没有看到任何允许附加额外代码的东西,例如事件处理程序。也许Java对于这样的东西是错误的语言。

通过继承实现它的一种方法是:

    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();
}

这是非常常见的行为,面向方面编程绝对是正确的

但我也对著名的CMS的做法印象深刻

对于每个包含具体方法的类,可以有一个属性(方法列表),其中包含在方法调用之前要执行的代码

您可以编写一个
registerBeforRecall(方法m)
方法,该方法接受一个方法并添加到列表中

您的方法应该在第一行(遍历方法列表)包含for循环,并逐个调用每个方法

不要忘记放置try-and-catch,如果调用中存在异常,则忽略异常

例如:

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的情况下被广泛使用。

您可以使用
AspectJ