在每个方法的开头和结尾执行命令(Java和/或C ++)

时间:2016-06-09 14:33:14

标签: java c++

我正在使用Java和C ++,我的问题与两种语言都有关。

我想编写一个命令,它在每个方法的开头和结尾执行,如:

public class myClass: // does it need to be derived from some base class?
  private int information;
  public get_information();
  void write_message(String str_Msg)
    {
       System.out.println(get_information());
    }
  ...

我们的想法是看到类似的内容(启动write_message()方法时):

myClass():write_message().start
  myClass():get_information().start
    <the mentioned information>
  myClass():get_information().stop
myClass():write_message().stop

所以,你可以想象,命令应该是这样的:

System.out.println(StackDepth(" ") + "__CLASS__:__FUNCTION__().start"); // at the beginning
System.out.println(StackDepth(" ") + "__CLASS__:__FUNCTION__().stop");  // at the end

有人知道如何做到这一点吗? (我知道,伪代码是一个糟糕的混合物或Java和C :-))

3 个答案:

答案 0 :(得分:1)

听起来你正在寻找像AspectJ这样的东西,你可以用它来指定代码来运行你的方法调用......

答案 1 :(得分:0)

C ++中的等价物是使用在范围退出时销毁的简单结构,例如

struct FuncOp {
  FuncOp(const char* name) : name_(name) { cout << "entry: " << name_ << endl; }
~FuncOp() { cout << "exit: " << name_ << endl; }
  const char* name_;
};

void foo() {
  FuncOp op{ __PRETTY_FUNCTION_ };
}

答案 2 :(得分:0)

我能想到用Java完成这个任务的唯一方法就是将你的类包装在另一个类中。包装类必须包含与包装类相同的方法,并将委托对其进行的调用:

class Test {
    public interface MessageWriter {
        void writeMessage(String str);
    }

    public static class MyClass implements MessageWriter {
        public void writeMessage(String str) {
            System.out.println(str);
        }
    }

    public static class Wrapper implements MessageWriter {
        private MessageWriter writer;

        public Wrapper(MessageWriter writer) {
            this.writer = writer;
        }

        public void writeMessage(String str) {
            System.out.println("Method start");
            writer.writeMessage(str);
            System.out.println("Method stop");
        }
    }

    public static void main (String[] args) throws java.lang.Exception {
        Wrapper wrapper = new Wrapper(new MyClass());
        wrapper.writeMessage("Hello world");
    }
}

输出:

Method start
Hello world
Method stop

基本上,您将在包装器中的每个方法调用之前和之后实现所需的功能。然后由包装器包装的类将完成实际的工作。

请注意,包装器仅适用于实现MessageWriter接口的任何类。