如何动态设置函数参数的class?
How to dynamically set the class of a function argument?
对于编译器的项目,我必须在 Java 文件中找到一个模式。例如,如果我输入“@x = 3”,程序必须 return 每次将 3 归因于某物时。
为此,我使用了 JDT 的 ASTParser。我解析文件并获得一个 CompilationUnit 对象,如下所示:
private static CompilationUnit getAST(char[] unit){
ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(unit); // set source
parser.setResolveBindings(true); // we need bindings later on
parser.setBindingsRecovery(true);
Map options = JavaCore.getOptions();
parser.setCompilerOptions(options);
CompilationUnit cu = (CompilationUnit) parser.createAST(null);
return cu;
}
现在,我正在做的是根据给我的模式构建另一个 AST。上面的示例结果如下:
AssignementExpression
LHS
Pattern("@x")
RHS
Literal("3")
然后我使用这个 AST 来搜索 CompilationUnit。问题是搜索节点的 ASTParser API class 需要知道我正在访问的节点的 class。
我需要创建一个新的访问者对象并定义我想在访问函数中做什么:
ASTVisitor visitor = (new ASTVisitor() {
public boolean visit(VariableDeclarationFragment node) {
// what I want to do
return true; // do not continue
}
}
所以我想做的是,在运行时,将AssignementExpression与VariableDeclarationFragment相关联,并用VariableDeclarationFragment调用访问函数。类似于:
Class nodeType = getTypeFromGrammar("AssignementExpression");
ASTVisitor visitor = (new ASTVisitor() {
public boolean visit(nodeType node) { // use the class that was returned above
// what I want to do
return true; // do not continue
}
}
一种方法是使用反射。
您需要使用 ASTVisitor 的命名子 class 而不是匿名 class。假设它叫做 MyAstVisitor。它可以覆盖多个 ASTVisitor.visit(T)
方法。
您可以通过Class.getMethod()获得合适的方法。例如:
Method visitMethod = MyASTVistor.class.getMethod( "visit", nodeType );
然后你可以调用方法 Method.invoke():
visitMethod.invoke( myAstVisitorInstance, myNode );
对于编译器的项目,我必须在 Java 文件中找到一个模式。例如,如果我输入“@x = 3”,程序必须 return 每次将 3 归因于某物时。
为此,我使用了 JDT 的 ASTParser。我解析文件并获得一个 CompilationUnit 对象,如下所示:
private static CompilationUnit getAST(char[] unit){
ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(unit); // set source
parser.setResolveBindings(true); // we need bindings later on
parser.setBindingsRecovery(true);
Map options = JavaCore.getOptions();
parser.setCompilerOptions(options);
CompilationUnit cu = (CompilationUnit) parser.createAST(null);
return cu;
}
现在,我正在做的是根据给我的模式构建另一个 AST。上面的示例结果如下:
AssignementExpression
LHS
Pattern("@x")
RHS
Literal("3")
然后我使用这个 AST 来搜索 CompilationUnit。问题是搜索节点的 ASTParser API class 需要知道我正在访问的节点的 class。
我需要创建一个新的访问者对象并定义我想在访问函数中做什么:
ASTVisitor visitor = (new ASTVisitor() {
public boolean visit(VariableDeclarationFragment node) {
// what I want to do
return true; // do not continue
}
}
所以我想做的是,在运行时,将AssignementExpression与VariableDeclarationFragment相关联,并用VariableDeclarationFragment调用访问函数。类似于:
Class nodeType = getTypeFromGrammar("AssignementExpression");
ASTVisitor visitor = (new ASTVisitor() {
public boolean visit(nodeType node) { // use the class that was returned above
// what I want to do
return true; // do not continue
}
}
一种方法是使用反射。
您需要使用 ASTVisitor 的命名子 class 而不是匿名 class。假设它叫做 MyAstVisitor。它可以覆盖多个 ASTVisitor.visit(T)
方法。
您可以通过Class.getMethod()获得合适的方法。例如:
Method visitMethod = MyASTVistor.class.getMethod( "visit", nodeType );
然后你可以调用方法 Method.invoke():
visitMethod.invoke( myAstVisitorInstance, myNode );