[英]How to get final package name?
我有代碼
private static class MyVisitor extends VoidVisitorAdapter<Object> {
@Override
public void visit(MethodCallExpr exp, Object arg) {
System.out.println("Scope: " + exp.getScope());
System.out.println("Method: " + exp.getName());
if(exp.getArgs() != null)
for(Expression e : exp.getArgs()) {
System.out.println("\tArgument: " + e.toString());
}
System.out.println();
}
}
和
CompilationUnit cu = JavaParser.parse(new File("Test.java"));
for(TypeDeclaration type : cu.getTypes()) {
for(BodyDeclaration dec : type.getMembers()) {
if(dec instanceof MethodDeclaration) {
MethodDeclaration mdec = (MethodDeclaration) dec;
BlockStmt block = mdec.getBody();
for(Statement stmt : block.getStmts()) {
MyVisitor visitor = new MyVisitor();
s.accept(visitor, null);
}
}
}
}
我有兩個問題:
if(stmt instanceof MethodCallExp)
但是出錯了。 我輸入了我現在使用的代碼。 這是執行檢查的一種方法嗎? System.out.println("Scope: " + exp.getScope());
將顯示對象/包/包+類名。 但是如何獲得它的類型? 例如代碼System.out.println("Hello world");
應該輸出 鍵入:java.io.PrintStream
Class.forName("java.lang.System").getField("out").getType();
在上面的代碼示例中,您將訪問者傳遞給方法體內的每個語句。 如果您在循環之外創建訪問者,它將能夠記住在先前語句中看到的信息。 這樣,您可以向訪問者添加一個字段來存儲變量聲明: final HashMap varNameToType = new HashMap();
您可以存儲如下所示的變量聲明。 當您進行方法調用時,您可以使用范圍嘗試通過地圖獲取類型。 如果映射不包含Type,則可能需要使用Reflection,因為該變量可能是JDK類的一部分。 我並不是說這涵蓋了所有情況。 例如,當您訪問父類的字段時,您將無法在代碼中的位置獲得有關該字段的任何信息 - 您可能需要查看不同的編譯單元。 @Override
public void visit(
final VariableDeclarationExpr n,
final Object arg) {
final Type varType = n.getType();
n.getVars().forEach(vd ->
varNameToType.put(vd.getId().getName(),varType)
);
}
如果您不需要堅持JavaParser
也許您可以通過Android lint工具的方式來解決它。 EcjParserTest.java 。 它使用Lombok
引擎蓋。
在第380
行,它在測試中比較了一個類似於你想要的輸出[ExpressionStatement], type: void, resolved method: println java.io.PrintStream
。
我沒有更深入的了解,但它看起來是一個很有希望的起點
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.