

お世話になります。

現在、javaの静的解析をjavaで行っており、メソッドの戻り値を取得したいと思っています。  
imethodを使ってメソッド名を取得するところまではできたのですが、戻り値の取得する方法がわかりません。

例えばメソッド内に以下のように書かれていた場合、実行した時の戻り値（この場合は0）ではなく、hogeという変数名が得たいと思っています。

[code]

    public int hoge(){
      int hoge=0;
      return hoge
    }
    
[/code]

以上です。  
よろしくお願いします。


CC BY-SA 4.0
2020-02-02T06:53:55.123
62720
2020-02-10T03:52:28.653
23065
question
java
javaの静的解析で戻り値を取得する方法


# 回答

`IMethod`を使っていることから、`class`ファイルから`return`文で指定された式を取得しようとしていると推測しますが、この方法では必要な情報を取得できないと思います。  
`class`ファイルに`return`文のソースコードの情報は含まれていないようです。  
`javap`コマンドや16進ダンプで調べてみましたが、それらしい情報は見当たりませんでした。

# ソースコードがある場合

ASTVisitor を継承するクラスを作成し、`ReturnStatement
node`を仮引数とする`visit`メソッド内で、`node.getExpression()`を使うと必要な情報を取得できます。

# 例

**静的解析対象コード**

[code]

    public class Myclass {
        public int hoge() {
            int ret;
            return ret * 2;
        }
    }
    
[/code]

**取得結果**  
`ret * 2`

# コードと実行結果

**コード**

[code]

    import org.eclipse.core.runtime.NullProgressMonitor;
    import org.eclipse.jdt.core.dom.ASTParser;
    import org.eclipse.jdt.core.dom.ASTVisitor;
    import org.eclipse.jdt.core.dom.CompilationUnit;
    import org.eclipse.jdt.core.dom.ReturnStatement;
    
    import static org.eclipse.jdt.core.dom.AST.JLS8;
    
    public class Main {
        public static void main(String[] args) {
            String source = "public class Myclass {" +
                    "   public int hoge() {\r\n" +
                    "       int ret = 0;\r\n" +
                    "       return ret * 2;\r\n" +
                    "   }\r\n" +
                    "}\r\n" +
                    "";
            System.out.println (source);
            ASTParser parser = ASTParser.newParser (JLS8);
            parser.setSource (source.toCharArray ( ));
            CompilationUnit unit = (CompilationUnit) parser.createAST (new NullProgressMonitor ( ));
    
            MyVisitor visitor = new MyVisitor ( );
            unit.accept (visitor);
            System.out.print ("END");
        }
    }
    
    class MyVisitor extends ASTVisitor {
        @Override
        public boolean visit(ReturnStatement node) {
            System.out.println ("node = [" + node.toString ( ) + "]");
            System.out.println ("node.getExpression () = [" + node.getExpression ().toString ( ) + "]");
            return super.visit (node);
        }
    }
    
[/code]

**実行結果**

[code]

    node = [return ret * 2;
    ]
    node.getExpression () = [ret * 2]
    
[/code]


CC BY-SA 4.0
2020-02-09T03:57:17.923
62894
2020-02-10T03:52:28.653
2020-02-10T03:52:28.653
35558
35558
62720
answer