2017-02-08 16 views
3

メソッドの出現を検索し、名前を変更し、メソッド本体を保持し、メソッドに注釈を追加し、注釈がインポートされていることを確認する必要があります。私は複数のクラスのプロジェクトでこれを行う必要があります。構造の検索と置換IntelliJ

文書はちょうど私には意味がありません、誰もこの機能を明かすことができますか、IntelliJの構造検索と置換機能を使用して以下を達成する方法はありますか?

import a; 
import b; 
import c; 

public class SomeClass extends SomeAbstractClass implements SomeInterface { 

    @Override 
    public void someMethod() { 
     methodbody.getMoreBody(); 
    } 
} 

import a; 
import b; 
import c; 
import some.package.with.annotation; 

public class SomeClass extends SomeAbstractClass implements SomeInterface { 

    @Override 
    @annotation 
    public void newMethodName() { 
     methodbody.getMoreBody(); 
    } 
} 
+0

は、メソッド名を右クリックし、どこにでも名前を変更する 'リファクタリングを選択するには):)この情報がお役に立てば幸いです。 – dnault

+0

はい、私はアノテーションを追加する必要があり、それもインポートです – ferahgo

+0

オーバーライドされたメソッド*は常にアノテーションを必要としますか?注釈の使用方法を制御できるのであれば、interface/abstractクラスのメソッドにアノテーションを付けて、Springの[AnnotationUtils.findAnnotation](http://docs.spring .io/spring/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationUtils.html#findAnnotation-java.lang.reflect.Method-java.lang.Class-)? – dnault

答えて

1

あなたは1対1の置き換え(パターンを検索する必要はありません)のため、構造検索は不要です。

次のようにすることができます。

  • はCtrl +Shiftキー + R(または編集 - >パスに置き換え - > [検索])。
  • 関連する位置に検索する

テキスト、次のテキストを追加します。と交換してください@Override[\S\s]*public void someMethod

を:@Override\n @annotation\n public void someMethod

を&が、その後すべてのオカレンスに適用する検索]をクリックします。

enter image description here

  • これはあなたのための部品を交換&見つけることを行います。

  • でも、このアノテーションは.javaファイルにインポートされません。 >タイプauto import- - > Javaの - >置くダニadd unambiguous imports on fly.にそれ以外の場合は、あなたがファイルごとに手動でインポートする必要がインポートが明確な輸入の場合は、設定によってその場でそれをインポートすることができます。ベースmethod`の名前を変更します> - >名前変更... -

enter image description here

+1

私は、注釈が何をするかを行うアスペクトを実装することによって完全に別のルートをとった。しかし、私が元の道を下った場合、これは私が探していた答えです。ありがとう! – ferahgo

+0

@ferahgo見て良かった.. :)) –

0

に変換当面の問題は、我々は特定のクラスに存在する特定の名前を持つすべてのメソッドにビヘイビアを適用するということです。メソッドの名前を変更する文字列置換操作は簡単です。 intelliJを使って構造的な置換を行うことは可能かもしれませんが(私は本当にわかりませんが)、完全にポイントカットを使って避けることができます。

@Pointcut(
    "execution(public * someMethod(..))") 
private void someMethod() {} 

@Pointcut("target(com.company.SomeAbstractClass+)") 
private void someAbstractClass() {} 

@Before("someMethod && someAbstractClass()") 
public void somePointCutAction(Pointcut pointcut) { 
    // Some logic to execute before the method that is a 
    // child of SomeAbstractClass and has a method name someMethod 
}