【问题标题】:Replace java comment with logging during or before runtime在运行时或之前用日志记录替换 java 注释
【发布时间】:2012-01-28 14:53:50
【问题描述】:

我很好奇是否可以在类或方法上使用注释,在运行期间或之前使用注释字符串的日志记录替换 cmets。例如,如果在 android 上:

@LogComments
class MyActivity extends Activity {
    @Override public void onCreate(Bundle b) {
        super.onCreate(b);
        // set some local vars
        int a = 1;
        int b = 2;
    }
}

会翻译成类似的东西

class MyActivity extends Activity {
    @Override public void onCreate(Bundle b) {
        super.onCreate(b);
        Log.d("TAG", "set some local vars");
        int a = 1;
        int b = 2;
    }
}

【问题讨论】:

  • 那必须在编译之前,类文件中不保留cmets。
  • 我不认为有这样的工具,我不相信它会是一个好主意。日志旨在跟踪程序在调试阶段所做的事情(通常应该删除这些日志)。日志还可以用于一些高级日志记录,例如错误报告或帮助开发人员使用工具。注释旨在解释代码的困难部分。他们没有相同的意图。 *
  • 哦,在 android 中,强烈建议在发布产品之前删除对 Logging 的所有调用。通常通过混淆
  • 是的,我非常了解建议,无论您是否认为这是一个好主意,都与回答问题无关。在开发过程中有这样的用例可能证明是有用的,例如在 android 开发过程中用注释良好的代码跟踪临时 ANR,以提供从哪里开始调查的快速提示。喜欢导致 adb 断开连接的 ANR 类型。

标签: java android annotations comments


【解决方案1】:

开箱即用。不,没有任何东西允许这样做。

现在,如果您想自己构建它,您也许可以创建某种编译器扩展,允许您解析文件并将 cmets 转换为日志表达式,具体取决于存在的注释。但这必须作为编译阶段的一个步骤发生,因为 cmets 不是类文件的一部分,因此无法在运行时发生。

但是,你说的是一个相当大的副项目来创建这样的东西。此外,这种方法也有一些限制,例如如果不向 cmets 添加某种表达式语言,就不可能在运行时写出变量值。最终,您将创建一些复杂的东西,而不是已经存在的东西、健壮的东西,并且通过使用 API 被使用了数百万次。

【讨论】:

  • 这很有趣,你以前做过这个吗?如果有,你有什么推荐的关于这个主题的阅读吗?
  • 确实看起来很复杂。并不是每条评论都可以直接转换为日志调用。
  • 你在看什么特别的东西吗?不久前我做了一些简短的搜索,发现了 Java cs.cornell.edu/projects/polyglot 的 Polyglot,但稍后将不得不进行更多研究。
  • 不,我从未做过与解析 Java 本身相关的任何事情,但我创建了自己的语言,并使用 ANTLR 等工具进行了解析。您需要做的是扩展 Java 的编译器,以便您的扩展可以获取注释并生成代码并将其插入 AST,然后再将其传递给编译器以呈现为字节码。使用 polygot 之类的东西似乎是一个更好的选择,因为它就是为了这个目的。
  • 这里的一般主题是上下文无关语法 (CFG),它定义了所有编程语言,如 Java、Javascript、Ruby 等。ANTLR 是一种旨在通过定义 Backus-Naur 形式来设计新语言的工具 ( BNF) 语法。已经定义了一些语法,您可以使用它们来生成解析 Java 代码的代码。虽然您可以将 Java 代码解析为抽象语法树 (AST),但您仍然需要将 AST 转换为编译器所做的字节码(即类文件)。 ANTLR 是一种用于解析语言的简洁工具,但解释该语言仍然取决于您。看看 polygot。
【解决方案2】:

你想达到什么目的?

如果您想在每个类的基础上启用日志记录,您可以使用某种标志(静态 final int 可以)来禁用或启用日志记录。看看这个帖子:How do I enable/disable log levels in Android? 了解更多关于登录 Android 的提示。

【讨论】:

  • 我已经有了一个静态方法来处理绑定到我的 android 应用程序实例并基于 ant 构建属性的日志。成就是知道如何在 java 运行之前或期间完成这些项目。提出问题的问题可以在对主要问题的评论中看到,但该问题的解决方案与问题无关。
【解决方案3】:

不,这是不可能的,因为 cmets 在运行时会被删除。我能想到的最好的方法是在运行时阅读 javadoc 并记录它们。但这不包括非 javadoc cmets。

【讨论】:

    猜你喜欢
    • 2022-08-02
    • 2010-12-28
    • 2022-08-17
    • 1970-01-01
    • 2011-11-05
    • 2017-12-18
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多