Java,是否可能-自动方法范围跟踪,如C++;

Java,是否可能-自动方法范围跟踪,如C++;,java,c++,Java,C++,我想知道是否有办法在java中实现自动范围跟踪 理想情况下,我希望得到类似于以下C++代码的行为(自动拾取函数、缩进级别、释放模式中没有OP)。 void bar() { _范围跟踪(级别调试); _日志(“东西”); } void foo() { _范围跟踪(级别调试); bar(); } XXX:foo():正在输入 XXX:bar():正在输入 XXX:东西 XXX:bar():离开,花了400个周期 XXX:foo():离开,花了3000个周期 #ifdef_调试 #定义范围跟踪(级别)

我想知道是否有办法在java中实现自动范围跟踪

理想情况下,我希望得到类似于以下C++代码的行为(自动拾取函数、缩进级别、释放模式中没有OP)。
void bar()
{
_范围跟踪(级别调试);
_日志(“东西”);
}
void foo()
{
_范围跟踪(级别调试);
bar();
}
XXX:foo():正在输入
XXX:bar():正在输入
XXX:东西
XXX:bar():离开,花了400个周期
XXX:foo():离开,花了3000个周期
#ifdef_调试
#定义范围跟踪(级别)范围日志::范围日志CONCAT\u宏(范围线)(级别函数)
#否则
#定义_范围_跟踪(级别)do{}while(0)
#恩迪夫
结构范围日志{
ScopeLog(int32_t level,const std::string&scope):m_level(level),m_indent(false),m_scope(scope.c_str()){init();}
ScopeLog(int32_t level,const char*scope):m_level(level),m_indent(false),m_scope(scope){init();}
void init()
{
如果(电平_LOG(m_level,m_scope获取大部分所需内容的最简单方法是使用。正如文档所述,生成方法名称信息的速度非常慢,因此希望这仅用于调试。这不会覆盖您想要的缩进,但可能有一种方法可以使用转换模式来完成


我唯一能想到的另一种方法是使用AspectJ创建一个切入点,在每个方法上触发一个日志方面,但要做到这一点,您需要使用cglib,我不确定它会比使用现有的log4j支持快得多。

这些似乎很相似。stackoverflow.com/questions/9422241/-已经看过这个了,但它非常难看/需要编写大量代码。必须到处使用try/finally并手动调用tracer。这个宏是非侵入性的1行程序。感谢Brad,我查看了log4j。不幸的副作用是,在每次返回前必须手动输入enter/leave log语句/etc。或者使用try/finally。我喜欢AspectJ的想法,will rjava:我是新的Java,必须使用它来代替C++。好的,记住在你的应用程序的类路径中包含CGLIB,这样你就可以为类和接口获得切入点支持。你的连接点看起来像是代码>调用(*)< /代码> -祝你好运。
void bar()
{
    _SCOPE_TRACE(Level_debug);
    _LOG("stuff");
}

void foo()
{
    _SCOPE_TRACE(Level_debug);
    bar();
}

XXX: foo(): entering
XXX:     bar(): entering
XXX:         stuff
XXX:     bar(): leaving, took 400 cycles
XXX: foo(): leaving, took 3000 cycles

#ifdef _DEBUG
#define _SCOPE_TRACE(level) scopelog::ScopeLog CONCAT_MACRO(scope,__LINE__)(level, __PRETTY_FUNCTION__)
#else
#define _SCOPE_TRACE(level) do {} while(0)
#endif

struct ScopeLog {
    ScopeLog(int32_t level, const std::string& scope) : m_level(level), m_indent(false), m_scope(scope.c_str()) { init(); }
    ScopeLog(int32_t level, const char* scope) : m_level(level), m_indent(false), m_scope(scope) { init(); }
    void init()
    {
        if(level < m_level)
        {
            _LOG(m_level, m_scope << ": enter");
            g_indent++;
            m_indent = true;
            m_tickStart = rdtsc_r();
        }
    }
    ~ScopeLog()
    {
        if (g_indent) g_indent--;
        if(level < m_level)
        {
            uint64_t tsc = rdtsc_r();
            _LOG(m_level, m_scope << ": leave, took " << tsc - m_tickStart << " cycles");
        }
    }
    int32_t     m_level;
    bool        m_indent;
    const char* m_scope;
    uint64_t    m_tickStart;
};