2014-10-11 1 views
4

Может ли кто-нибудь дать мне разъяснения по использованию второго аргумента arg метода visit, как показано в следующем коде из JavaParser documentation example page?

Я не могу найти информацию в Интернете.Метод определения аргумента в JavaParser

public class MethodPrinter { 

    public static void main(String[] args) throws Exception { 
     // creates an input stream for the file to be parsed 
     FileInputStream in = new FileInputStream("test.java"); 

     CompilationUnit cu; 
     try { 
      // parse the file 
      cu = JavaParser.parse(in); 
     } finally { 
      in.close(); 
     } 

     // visit and print the methods names 
     new MethodVisitor().visit(cu, null); 
    } 

    /** 
    * Simple visitor implementation for visiting MethodDeclaration nodes. 
    */ 
    private static class MethodVisitor extends VoidVisitorAdapter { 

     @Override 
     public void visit(MethodDeclaration n, Object arg) { 
      // here you can access the attributes of the method. 
      // this method will be called for all methods in this 
      // CompilationUnit, including inner class methods 
      System.out.println(n.getName()); 
     } 
    } 
} 

ответ

3

Это довольно просто.

Когда вы вызываете метод accept с вашим посетителем, вы можете предоставить этот дополнительный аргумент, который затем будет передан в методы visit вашего посетителя. Это в основном способ передачи некоторого контекстного объекта посетителю, позволяющего самому посетителю оставаться без гражданства.

Например, рассмотрите случай, когда вы хотите собрать все имена методов, которые вы видите во время посещения. Вы можете указать Set<String> в качестве аргумента и добавить имена методов в этот набор. Думаю, это и есть причина этого. (Вместо этого я лично предпочитаю постоянных посетителей).

Кстати, вы должны обычно называют

cu.accept(new MethodVisitor(), null); 

не наоборот.