は、私はそれがソースコードです使用して、クラス内のすべての呼び出されるメソッド(クラスで宣言かのいずれか)を診断する必要があります。メソッドにクラスのソースコードを入力として与え、クラスとして呼び出されたメソッドを出力として取得する手段。実際、私はJavaの語彙アナライザと同じように動作するクラス/メソッドが必要です。 呼び出されたすべてのメソッドを診断する方法はありますか?当然のJavaクラスに呼び出されたメソッドを診断するクラスはありますか?
I)は、(Runtime.traceMethodCallsを使用しようとしました。この問題を解決するには出力はありませんでした。私はjava -gを使ってjavaデバッグを実行する必要があることを読んだが、残念ながらjava -gを実行しようとするとエラーが発生する。今私は何をすべきですか?アプローチはありますか?
答えて
オープンソースの静的アナライザの1つをJavaの出発点として利用できます。 Checkstyleを使用すると、独自のモジュールを構築できます。 Sootにはかなり柔軟なAPIと良い例があり、call analysisという優れた例があります。 FindBugsもカスタムモジュールを書くことができます。 AFAIKは3つすべてがJAR形式で埋め込み可能なので、あなたが思いついたものを自分のカスタムプログラムに組み込むことができます。
1)一般的には、 Reflectionは常にコードは、あなたが実際にコードを実行せずに分析することができませんメソッドの呼び出しを行うことができます。この方法は、保証どのような方法ではない(あるいはそう)すべて呼び出し、それはあなたがそれをするたびに呼び出すことができますを行うことがあるため、どちらかあなたの全体像を与えることはありませんメソッドの呼び出しをトレースする
2) 。
あなたの最善の策は、「ベストエフォート」コード分析のいくつかの種類です。コンパイラの助けを借りてみてください。たとえば、コードをコンパイルし、生成されたクラスファイルをすべての出力された外部シンボルに対して分析します。すべてのコールを捕捉することは保証されませんが(#1を参照)、ほとんどの場合、コールを閉じることになります。
上記のようにバイトコードを分析するには、JBoss Bytecodeをご覧ください。これはテスト用ですが、コードの分析にも役立ちます。
あなたは、コンパイラに差し込むことがあります。
は、例えば、プロジェクトロンボクのソースを見てもらいます。 そこには一般的なメカニズムではありませんので、彼らは日食のコンパイラのための1つのjavacのためのメカニズムと1を持っています。
あなたの質問から、あなたが解決しようとしている正確な問題が何であるかを決定することは困難です。 しかし場合:
- あなたは、あなたがIDEのでは、いくつかのIDE(Eclipseの、のIntelliJ IDEA Community Editionのなど)を使用することができ、冗長であり、除去することができるそれの部品を参照するために、ソースコードを解析したい場合メソッドの使用法を検索する機能があり、コードを分析し、未使用のメソッドを警告/エラーとして強調表示する機能もあります。
実行時に何らかのメソッドが呼び出される場所を知りたい場合は、プロファイリングツールを使用してそれらのメソッド呼び出しに関する情報を収集できます。ツールによっては、それらのメソッドが呼び出された場所からも見ることができます。しかし、あなたがプログラムを実行すると、あなたの面白いメソッドがすべての可能な場所から呼び出されるという保証はありません。
メソッドの呼び出しグラフを表示するための自動ツールを開発している場合は、次に、ソースを解析してコードエンティティの作業を開始する必要があります。 1つの方法は、独自のコンパイラを実装し、そこから行くことです。しかし、より簡単な方法は、オープンソースのパーサ/コンパイラ/アナライザを再利用して、そのツールを構築することです。
- 私は、このようなfunctionalitysを持っており、またその情報源が利用できる持っているよく知られて製品のEclipseがあるソースhttp://www.jetbrains.org/display/IJOS/Home
- でダウンロードすることができるのIntelliJ IDEAのCEを使用しました。
これらの製品はいずれも膨大なコードベースを持っているため、興味深い部分を分離することは困難です。しかし、それはあなた自身のJavaコンパイラを書くよりも簡単になり、すべてのコーナーケースでうまく動作することを心配しています。
私は自分の質問で説明したように、どのメソッドがソースコードを解析してどのメソッドを呼び出すのかを知りたいだけです。 – zari
はい。私はそれを持っていますが、あなたがその仕事を達成したいという文脈が不明な点が残っています。 1つのプロジェクトだけを調べる必要がある場合は、IDEを使用してください。しかし、例えば、ある種の自動化されたツールを作成して、生徒が冗長コードをソリューションとしてあまりにも多く提出しないことを確認したい場合に備えてください。あるいは、コードラインの数を増やすために下請け業者が冗長コードを作成していないことを確認するには、バックグラウンドでソースを分析し、コード内の未使用メソッドについて警告する自動サービスが必要です。 – Lauri
確かに私はソフトウェアアーキテクチャのための自動ツールを開発しています。 .javaファイルを入力として取得し、出力を生成します。ツールは、コードのスタティックコールグラフを診断する必要があります。 – zari
- 1. Java - ネストされたクラスのメソッド、特にActionListenerを呼び出す
- 2. メソッドは、常にオブジェクトまたはクラスによって呼び出される必要がありますか? (Java)
- 3. 呼び出すクラス/メソッドを教えてくれるプログラムはありますか?
- 4. クラスの他のメソッドが呼び出されたときに、クラスのメソッドを呼び出す方法(Ruby)
- 5. 派生クラスは、基本クラスのstaticメソッドをオーバーライドされたプロパティで呼び出す必要があります
- 6. 基本クラスから継承されたメソッドを呼び出す
- 7. テンプレートからクラス保護されたメソッドを呼び出す
- 8. 呼び出されたJavaプログラムの親クラスを知るには?
- 9. "WebSecurity"クラスの他のメソッドを呼び出す前に "WebSecurity.InitializeDatabaseConnection"メソッドを呼び出す必要があります
- 10. ループから呼び出されたメソッドを中断する
- 11. テストメソッドから呼び出されたメソッドを持つクラスのOCMock
- 12. クラスのプロパティが設定されているときにメソッドを呼び出す方法はありますか?
- 13. Javaクラスからいくつかのjavascriptメソッドを呼び出す
- 14. 別のクラスから呼び出すメソッド
- 15. Javaの親クラスで関数を呼び出す方法はありますか?
- 16. javaクラスからアクティビティメソッドを呼び出す
- 17. javacriptからjavaクラスを呼び出す
- 18. クラスがJavaで読み込まれるときにメソッドを呼び出す
- 19. Javaのクラスの外部からメソッドを呼び出す
- 20. Javaの別のクラスからメソッドを呼び出す方法
- 21. 親クラスの@BeforeClassメソッドは呼び出されません
- 22. Javaクラスからjavafxクラスを呼び出す方法は?
- 23. ジェスチャー認識プログラムのメソッドが呼び出される前に呼び出せるメソッドはありますか?
- 24. あるクラスから別のクラスに関数を呼び出す
- 25. オーバーライドメソッドが呼び出されたときに(基本クラスの)メソッド呼び出しを強制する方法はありますか?
- 26. コンストラクタを呼び出さずにクラス内のメソッドを呼び出す
- 27. クラスのインラインメソッドを呼び出すpublicメソッド
- 28. クラスで静的メソッドを呼び出す?
- 29. 別のクラスを呼び出すRepaint()メソッド
- 30. クラスCでメソッドを呼び出す#
スートは、アプリに参加する各クラスを手動で追加する必要があり、不完全なコールグラフを生成することがよくあります。スートのもう一つの難点は、スートがダイナミックコールグラフを静的でなくすることです。ありがとうございましたあなたの答え – zari
Hmmm、それはトレース分析のための開始クラスを使用し、それが遭遇したように従属クラスを引っ張って、クラスがそのクラスパスに存在する限り。しかし、それはしばらくしている、私は再びAPIをチェックする必要があります。 – Perception
はい、コールグラフを作成するには開始ノードが必要です。クラスを追加するために使用したステートメントは以下の通りです。 Scene.v()。setEntryPoints(entryPoints);Scene.v()。addBasicClass( "java.lang.Object"、SootClass.BODIES); Scene.v()。addBasicClass( "MySets_MyWork.FunctionCalls"、SootClass.BODIES); Scene.v()。addBasicClass( "java.lang.String"、SootClass.BODIES); soot.Main.main(args);コードにクラスが追加されていない場合、例外が発生し、soot.Mainを呼び出す前にクラス...を追加する必要があることを通知します。 ...。 – zari