- PVSM.RU - https://www.pvsm.ru -
Услышав об аспектно ориентированном программировании я, как Android разработчик, сразу подумал, что на Android это вряд ли заработает, однако, решил попробовать. Я был очень удивлен, когда уже через 5 минут приложение, использующее AspectJ, успешно заработало на телефоне.
Не буду убеждать в необходимости использования аспектов в Android и приводить примеры «uses cases», просто приведу пример того, как добавить к своему приложению возможность использования аспектов. Что такое аспекты и для чего их использовать прекрасно описано, например, на wiki [1].
В качестве IDE для разработки я уже давно перешел на Android Studio, а следовательно использую gradle как систему сборки. Для нее и буду приводить пример конфигурирования.
Весь процесс подключения AspectJ состоит из следующих шагов:
buildscript скрипта сборки вашего проекта добавляем в dependencies строку:
classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'
build.gradle модуля приложения добавляем:
apply plugin: "android-aspectj"
dependencies {
compile 'org.aspectj:aspectjrt:1.8.+'
}
@Aspect
public class MainActivityAspect {
private static final String TAG = "helloaspectj";
@Pointcut("execution(* ru.hoticecream.helloaspectj.ui.MainActivity.onCreate(..))")
public void onCreateMethod(){}
@Before("onCreateMethod()")
public void doBeforeOnCreate(JoinPoint joinPoint) {
Log.i(TAG, "AspectJ was here");
}
}
Данный аспект встраивается до вызова метода MainActivity.onCreate, выводя соответствующее сообщение в лог.
Теперь, запустив приложение и открыв MainActivity, мы увидим в логе:
... I/helloaspectj﹕ AspectJ was here
Приведу еще пример использования аспекта.
Для этого в MainActivity добавим метод, устанавливающий определенному текстовому полю сообщение:
private TextView mGreetingText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGreetingText = (TextView) findViewById(R.id.greeting_message);
setGreetingMessage("Hello Android");
}
private void setGreetingMessage(String message) {
mGreetingText.setText(message);
}
Как видите, поле принимает значение «Hello Android», запустив приложение можно в этом убедиться;)
Теперь добавим все в тот же класс аспекта следующие методы:
@Pointcut("execution(* ru.hoticecream.helloaspectj.ui.MainActivity.setGreetingMessage(..))")
public void setGreetingMessageMethod(){}
@Around("setGreetingMessageMethod()")
public void makeNasty(final ProceedingJoinPoint pjp)
throws Throwable {
Log.d(TAG, pjp.getSignature().toLongString());
pjp.proceed(new Object[] { "Hello AspectJ" });
}
В теперь этот аспект еще ищет метод setGreetingMessage и заменяет его вызов на содержимое метода makeNasty</nasty>, используя для этого анотацию <code>@Around
Запустив приложение, мы уже увидим «Hello AspectJ». При этом MainActivity.java мы не изменяли.
На этом все. Надеюсь статья была вам полезна.
Напоследок пару ссылок:
Автор: HotIceCream
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android/66058
Ссылки в тексте:
[1] wiki: http://ru.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
[2] github.com/uPhyca/gradle-android-aspectj-plugin: https://github.com/uPhyca/gradle-android-aspectj-plugin
[3] www.youtube.com/watch?v=X_QJMKEgJBk&index=3&list=PLCA5CB42F5A816A17: http://www.youtube.com/watch?v=X_QJMKEgJBk&index=3&list=PLCA5CB42F5A816A17
[4] github.com/HotIceCream/helloaspectj: https://github.com/HotIceCream/helloaspectj
[5] Источник: http://habrahabr.ru/post/231287/
Нажмите здесь для печати.