我是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/