Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过aspect'在java代码中插入方法;什么是切入点?_Java_Android_Aop_Aspectj - Fatal编程技术网

如何通过aspect'在java代码中插入方法;什么是切入点?

如何通过aspect'在java代码中插入方法;什么是切入点?,java,android,aop,aspectj,Java,Android,Aop,Aspectj,我是aspectj的新手 我有一个带有活动的android应用程序。当我按下菜单按钮时,该活动不显示任何菜单。我发现,应用程序所有者没有重写方法onCreateOptions菜单(Menu Menu),所以现在我想在该应用程序活动类中重写该方法。但我被限制不更改其原始代码,并通过aspect进行更改。所以我想知道有没有办法通过aspectj的切入点将这个方法添加到他们的代码中 这是我的android文件MainActivity.java: import android.os.Bundle; im

我是aspectj的新手

我有一个带有活动的android应用程序。当我按下菜单按钮时,该活动不显示任何菜单。我发现,应用程序所有者没有重写方法
onCreateOptions菜单(Menu Menu)
,所以现在我想在该应用程序活动类中重写该方法。但我被限制不更改其原始代码,并通过aspect进行更改。所以我想知道有没有办法通过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这样的“重炮”更可取。据我所知,你想操纵另一个应用程序,你没有源代码,不能用重写的方法将你的子类注入其中。如果这是正确的,我确实理解AspectJ的必要性。下面是你问题的答案:

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

API基类:

package org.base.api;
公共课堂活动{
创建时受保护的void(对象对象对象){
System.out.println(“onCreate默认实现”);
}
公共布尔onCreateOptions菜单(对象对象对象){
System.out.println(“onCreateOptions菜单默认实现”);
返回false;
}
}
驱动程序应用程序:

正如我所说的,我假设这个应用程序是商业化的,所以你不能用传统的面向对象方法来改变它的行为。应用程序覆盖一个API方法,但不覆盖您想要的API方法

package com.commercial.app;
导入org.base.api.Activity;
公共类商业活动扩展了活动范围{
@凌驾
创建时受保护的void(对象对象对象){
System.out.println(“由商业应用程序覆盖的onCreate实现”);
}
公共静态void main(字符串[]args){
System.out.println(“启动商业应用程序”);
CommercialAppActivity活动=新的CommercialAppActivity();
activity.onCreate(null);
activity.onCreateOptions菜单(“菜单”);
System.out.println(“停止商业应用程序”);
}
}
样本输出:

启动商业应用程序
onCreate实现被商业应用程序覆盖
onCreateOptions菜单默认实现
停止商业应用程序
通过ITD(类型间定义)引入所需方法的方面:

package de.scrum\u master.aspect;
导入com.commercial.app.CommercialAppActivity;
公共方面应用程序方面{
public boolean CommercialAppActivity.onCreateOptions菜单(对象obj){
System.out.println(“onCreateOptions菜单实现被方面覆盖”);
返回false;
}
}
spect的样本输出:

启动商业应用程序
onCreate实现被商业应用程序覆盖
OnCreateOptions菜单实现被方面覆盖
停止商业应用程序

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

为什么不扩展此活动?@pskink我可以在哪里扩展此活动。你能用代码给我解释一下吗。?你知道如何扩展某个类吗?