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

标签 java android aop aspectj

我是aspectj新手。

我有一个带有 Activity 的 Android 应用程序。当我按下菜单按钮时,该 Activity 不显示任何菜单。我发现,应用程序所有者没有重写方法 onCreateOptionsMenu(Menu menu) 所以现在我想在该应用程序 Activity 类中重写此方法。但我被限制不能更改他们的原始代码,并通过方面进行更改。所以我想知道有什么方法可以通过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;
    }

如果可能的话,建议我任何切入点来实现上述目标。

提前谢谢你。 。

最佳答案

基本上我同意@pskink的评论:如果你可以扩展一个类并重写它的方法,这比使用“重炮”(例如AspectJ)更好。据我了解,您想要操作另一个应用程序,您没有源代码,并且无法使用重写的方法将子类注入(inject)其中。如果这是正确的,我确实理解 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

塔达!将其转移到您的情况应该很简单。

关于java - 如何通过aspect的切入点在java代码中插入方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22907538/

相关文章:

java - IntelliJ IDEA 中 Java 项目的相对资源路径

c# - 消除重复的 try/catch 代码

java - 为什么应该为 JAX-RS 实现声明一个接口(interface)?

java - 在 Java 8 中重用流

JavaFX CSS 解析错误

java - 发现多个文件的操作系统独立路径为 'META-INF/groovy-release-info.properties'

android - 选择器中的 9-Patch 显示黑点

android - 在自定义警报对话框中显示 map

spring - @PreAuthorize 和 hasPermission() 执行代码两次

java - 如何从其他项目中存在的类文件获取输入流