如何通过aspect'在java代码中插入方法;什么是切入点?
我是aspectj的新手 我有一个带有活动的android应用程序。当我按下菜单按钮时,该活动不显示任何菜单。我发现,应用程序所有者没有重写方法如何通过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
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我可以在哪里扩展此活动。你能用代码给我解释一下吗。?你知道如何扩展某个类吗?