2017-02-08 6 views
3

Мне нужно найти вхождения метода, изменить имя, сохранить тело метода, добавить аннотацию к методу и убедиться, что аннотация импортирована. Мне нужно сделать это в нескольких проектах по проекту.Структурная находка и замена IntelliJ

Документы просто не имеют для меня смысла, может ли кто-нибудь пролить свет на эту функцию и как я могу выполнить следующее, используя функцию IntelliJ Structural Find and Replace?

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

Чтобы изменить имя везде, щелкните правой кнопкой мыши на имени метода, выберите 'Refactor -> Переименовать ... -> Переименовать базу method'. – dnault

+0

Да, но мне нужно добавить аннотацию и ее импорт также – ferahgo

+0

Есть ли переопределенный метод * всегда * нужна аннотация?Если у вас есть контроль над тем, как используется аннотация, было бы целесообразно аннотировать метод в интерфейсе/абстрактном классе и искать аннотацию для методов суперкласса, используя что-то вроде Spring [AnnotationUtils.findAnnotation] (http: //docs.spring .io/весна/документы/ток/Javadoc-апи/орг/springframework/ядро ​​/ аннотаций/AnnotationUtils.html # findAnnotation-java.lang.reflect.Method-java.lang.Class-)? – dnault

ответ

1

Так как вы только простая потребность один к одному не заменить (не нужно искать модели), вам не нужен структурный поиск.

Вы можете сделать следующее.

  • Ctrl + Сдвиг + R (или Edit -> Найти -> Заменить в пути).
  • Добавить следующие тексты в соответствующих положениях

Текст найти: @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. В противном случае вы должны импортировать их вручную для каждого файла. Надеюсь, что это помогает :))

enter image description here

+1

Я сделал еще один маршрут, выполнив Аспект, который сделает то, что делает аннотация. Но это тот ответ, который я искал, если я пошел по исходному пути. Благодаря! – ferahgo

+0

@ferahgo приятно видеть .. :)) –

0

Проблема под рукой, что мы хотим применить поведение ко всем методам с определенным именем, которые существуют в определенном классе. Операция замены строки для переименования метода проста. Использование intelliJ для структурной замены может быть возможно (я действительно не знаю), но его можно полностью избежать, используя pointcut.

@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 
} 
Смежные вопросы