如何通过aspect的切入点在java代码中插入一个方法?

时间:2014-04-07 08:43:44

标签: java android aop aspectj

我是aspectj的新手。

我有一个带有活动的android appplication。当我按下菜单按钮时,该活动不显示任何菜单。我发现,应用程序所有者还没有覆盖方法onCreateOptionsMenu(Menu menu)所以现在我想在该应用程序活动类中覆盖此方法。但我一直被限制为不更改原始代码,并通过方面进行更改。所以我想知道有什么方法可以通过aspectj的切入点将这个方法添加到他们的代码中。

这是我的android文件MainActivity.java

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;



      public class MainActivity extends Activity {

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.sampleactivity);

            }


        }

我想通过切入点在上面的代码中添加以下方法:

  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.sampleactivity, menu);
        return true;
    }

如果可能的话,建议我做任何切入点的事情。

提前感谢你。 。

1 个答案:

答案 0 :(得分:1)

基本上我同意@pskink的评论:如果你只是扩展一个类并覆盖它的方法,这比使用像AspectJ这样的“重型火炮”更可取。从我的理解,你想要操纵另一个你没有源代码的应用程序,并且你不能使用重写方法注入你的子类。如果这是正确的,我确实理解AspectJ的必要性。所以这是你的问题的答案:

好吧,我不使用Android而且只是为了演示解决方案而懒得下载完整的Android JDK,但我刚创建了一个假的例子。

API基类:

package org.base.api;

public class Activity {
    protected void onCreate(Object obj) {
        System.out.println("onCreate default implementation");
    }

    public boolean onCreateOptionsMenu(Object obj) {
        System.out.println("onCreateOptionsMenu default implementation");
        return false;
    }
}

驱动程序应用程序:

正如我所说,我假设该应用程序是商业用途,因此您无法通过传统的OOP方式改变其行为。该应用程序会覆盖一个API方法,但不会覆盖您想要的方法。

package com.commercial.app;

import org.base.api.Activity;

public class CommercialAppActivity extends Activity {
    @Override
    protected void onCreate (Object obj) {
        System.out.println("onCreate implementation overridden by commercial app");
    }

    public static void main(String[] args) {
        System.out.println("Starting commercial app");
        CommercialAppActivity activity = new CommercialAppActivity();
        activity.onCreate(null);
        activity.onCreateOptionsMenu("menu");
        System.out.println("Stopping commercial app");
    }
}

示例输出:

Starting commercial app
onCreate implementation overridden by commercial app
onCreateOptionsMenu default implementation
Stopping commercial app

通过ITD(类型间定义)引入所需方法的方面:

package de.scrum_master.aspect;

import com.commercial.app.CommercialAppActivity;

public aspect AppManipulatorAspect {
    public boolean CommercialAppActivity.onCreateOptionsMenu(Object obj) {
        System.out.println("onCreateOptionsMenu implementation overridden by aspect");
        return false;
    }
}

带有光谱的示例输出:

Starting commercial app
onCreate implementation overridden by commercial app
onCreateOptionsMenu implementation overridden by aspect
Stopping commercial app

Tadaa!将此转移到您的情况应该是直截了当的。