我正在使用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 :-))
答案 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接口的任何类。