<small id='qc2Xe'></small><noframes id='qc2Xe'>

    • <bdo id='qc2Xe'></bdo><ul id='qc2Xe'></ul>
      1. <legend id='qc2Xe'><style id='qc2Xe'><dir id='qc2Xe'><q id='qc2Xe'></q></dir></style></legend>
        <tfoot id='qc2Xe'></tfoot>

      2. <i id='qc2Xe'><tr id='qc2Xe'><dt id='qc2Xe'><q id='qc2Xe'><span id='qc2Xe'><b id='qc2Xe'><form id='qc2Xe'><ins id='qc2Xe'></ins><ul id='qc2Xe'></ul><sub id='qc2Xe'></sub></form><legend id='qc2Xe'></legend><bdo id='qc2Xe'><pre id='qc2Xe'><center id='qc2Xe'></center></pre></bdo></b><th id='qc2Xe'></th></span></q></dt></tr></i><div id='qc2Xe'><tfoot id='qc2Xe'></tfoot><dl id='qc2Xe'><fieldset id='qc2Xe'></fieldset></dl></div>

        从 Java 注释处理器访问源代码

        时间:2023-07-26
        • <bdo id='UP6ef'></bdo><ul id='UP6ef'></ul>
        • <legend id='UP6ef'><style id='UP6ef'><dir id='UP6ef'><q id='UP6ef'></q></dir></style></legend>

                <tbody id='UP6ef'></tbody>

              <i id='UP6ef'><tr id='UP6ef'><dt id='UP6ef'><q id='UP6ef'><span id='UP6ef'><b id='UP6ef'><form id='UP6ef'><ins id='UP6ef'></ins><ul id='UP6ef'></ul><sub id='UP6ef'></sub></form><legend id='UP6ef'></legend><bdo id='UP6ef'><pre id='UP6ef'><center id='UP6ef'></center></pre></bdo></b><th id='UP6ef'></th></span></q></dt></tr></i><div id='UP6ef'><tfoot id='UP6ef'></tfoot><dl id='UP6ef'><fieldset id='UP6ef'></fieldset></dl></div>

              <small id='UP6ef'></small><noframes id='UP6ef'>

              <tfoot id='UP6ef'></tfoot>
                1. 本文介绍了从 Java 注释处理器访问源代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我正在尝试从 Java 注释处理器中访问某个类型的实际原始源代码.这有可能吗?谢谢!

                  I am trying to access the actual original source code of a type from within a Java Annotation Processor. Is this possible somehow? Thanks!

                  推荐答案

                  我遇到了一个问题,我必须访问一些源代码(非字符串/非原始常量的初始化代码)并通过访问解决了它通过 编译器树 API.

                  I had a problem where I had to access some source code (the initializer code for a non-String/non-primitive constant) and got it solved by accessing the source code via the Compiler Tree API.

                  这是一般配方:

                  1.创建自定义 TreePathScanner:

                  private static class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees> {
                  
                  private String fieldName;
                  
                  private String fieldInitializer;
                  
                  public void setFieldName(String fieldName) {
                      this.fieldName = fieldName;
                  }
                  
                  public String getFieldInitializer() {
                      return this.fieldInitializer;
                  }
                  
                  @Override
                  public Object visitVariable(VariableTree variableTree, Trees trees) {
                      if (variableTree.getName().toString().equals(this.fieldName)) {
                          this.fieldInitializer = variableTree.getInitializer().toString();
                      }
                  
                      return super.visitVariable(variableTree, trees);
                  }
                  

                  <强>2.在您的 AbstractProcessor 中,通过覆盖 init 方法保存对当前编译树的引用:

                  @Override
                  public void init(ProcessingEnvironment pe) {
                      super.init(pe);
                      this.trees = Trees.instance(pe);
                  }
                  

                  3.获取 VariableElement 的初始化源代码(在您的情况下为枚举):

                  // assuming theClass is a javax.lang.model.element.Element reference
                  // assuming theField is a javax.lang.model.element.VariableElement reference
                  String fieldName = theField.getSimpleName().toString();
                  CodeAnalyzerTreeScanner codeScanner = new CodeAnalyzerTreeScanner();
                  TreePath tp = this.trees.getPath(theClass);
                  
                  codeScanner.setFieldName(fieldName);
                  codeScanner.scan(tp, this.trees);
                  String fieldInitializer = codeScanner.getFieldInitializer();
                  

                  就是这样!最后 fieldInitializer 变量将包含用于初始化我的常量的确切代码行.通过一些调整,您应该能够使用相同的配方来访问源树中其他元素类型的源代码(即方法、包声明等)

                  And that's it! In the end the fieldInitiliazer variable is going to contain the exact line(s) of code used to initialize my constant. With some tweaking you should be able to use the same recipe to access the source code of other element types in the source tree (i.e. methods, package declarations, etc)

                  有关更多阅读和示例,请阅读此 文章:来源使用 Java 6 API 进行代码分析.

                  For more reading and examples read this article: Source Code Analysis Using Java 6 APIs.

                  这篇关于从 Java 注释处理器访问源代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:如何创建作为一组杰克逊注释的注释? 下一篇:通过使用反射获取带有注释的字段列表

                  相关文章

                  最新文章

                  1. <i id='L99fo'><tr id='L99fo'><dt id='L99fo'><q id='L99fo'><span id='L99fo'><b id='L99fo'><form id='L99fo'><ins id='L99fo'></ins><ul id='L99fo'></ul><sub id='L99fo'></sub></form><legend id='L99fo'></legend><bdo id='L99fo'><pre id='L99fo'><center id='L99fo'></center></pre></bdo></b><th id='L99fo'></th></span></q></dt></tr></i><div id='L99fo'><tfoot id='L99fo'></tfoot><dl id='L99fo'><fieldset id='L99fo'></fieldset></dl></div>
                    • <bdo id='L99fo'></bdo><ul id='L99fo'></ul>

                    1. <legend id='L99fo'><style id='L99fo'><dir id='L99fo'><q id='L99fo'></q></dir></style></legend>
                      <tfoot id='L99fo'></tfoot>

                      <small id='L99fo'></small><noframes id='L99fo'>