我是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;
}
如果可能的话,建议我做任何切入点的事情。
提前感谢你。 。
答案 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!将此转移到您的情况应该是直截了当的。