2017-08-11 4 views
2

私の目的は、プロジェクトのパブリックAPIクラスのすべての推移的依存関係をリストアップし、コード変更があった場合それらの依存関係に例えばインタフェースを介してのみ使用される実装クラスを含むJavaクラスの推移的な依存関係をすべて見つけてください

だから、
class MyApi { 
    MyDao md; 
    public void methodA() { 
     //do something with md; 
    } 
} 

interface MyDao { } 

class MyDaoImpl implements MyDao { } 

私はMyDaoImplが変更されている(コミット履歴から言う)と私はMyApi.methodAがMyDaoImplを使用しています知っている、そして私のテストは、それをチェックするに焦点を当てるべきであることがわかっている場合。 MyDaoとMyDaoImplの両方を含むMyApi.methodA()の依存関係のリストが必要です。

これまでのところ2つのツール、https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.htmlhttp://depfind.sourceforge.net/を試しましたが、それらは有望ですが、問題を完全に解決していないようです。どちらのツールでも、クラスがインターフェイスに依存する場合、そのインターフェイスの実装を推移的な依存関係として含める方法はありません。

大幅なカスタマイズを行うことなく、任意のツールからこの情報を引き出す方法はありますか?

+0

メソッドに 'md = new MyDaoImpl()'を追加する必要があります。さもなければ、 'MyDaoImpl'はあなたのappliに接続していません。 – Nathan

+0

実際のコードでは、実装クラスをインジェクトするためにスプリングを使用しているため、新しいMyDaoImpl()は実際にはありません。私は、コードに直接作成されていない場合でも、MyApiが使用しているインタフェースの実装をすべて取り込む方法を探しています。 – ab2000

答えて

1

JArchitectをご利用いただけます。 は、右のどこUIでメソッドをクリックし、メニューを選択:選択方法...> ...(直接的または間接的に)私を使用しているのようなコードクエリにつながる:

from m in Methods 
let depth0 = m.DepthOfIsUsing("myNamespace.MyClass.MyMethod()") 
where depth0 >= 0 orderby depth0 
select new { m, depth0 } 

問題はそのようなクエリが間接的な使用を提供しますが、インターフェイス(または基本クラスで宣言されたオーバーライドされたメソッド)を介してが発生する呼び出しを探しません。

がうまくいけば、あなたが求めているものをこのクエリで取得することができます。

// Retrieve the target method by name 
let methodTarget = Methods.WithFullName(""myNamespace.MyClass.MyMethod()"").Single() 

// Build a ICodeMetric<IMethod,ushort> representing the depth of indirect 
// call of the target method. 
let indirectCallDepth = 
    methodTarget.ToEnumerable() 
    .FillIterative(
     methods => methods.SelectMany(
      m => m.MethodsCallingMe.Union(m.OverriddensBase))) 

from m in indirectCallDepth.DefinitionDomain 
select new { m, callDepth = indirectCallDepth[m] } 

このクエリの2つの角の石は、以下のとおりです。FillIterative(へ

  • コール)を再帰的、間接を選択しますコール。
  • 名前のとおり、IMethod.OverriddensBaseプロパティの呼び出しが示唆しています。メソッドの場合Mこれは、ベースクラスまたはインターフェイスで宣言されたすべてのメソッドの列挙型を返します。Mによって上書きされます。
+0

James、JArchitectのおかげで、私の予想どおりのクエリがうまくいくように思えます。 – ab2000

関連する問題