android - How to insert a method in java code via aspect's pointcut? -
i new aspectj.
i have android appplication activity. activity not show menu when press menu button. found that, application owner have not overridden method oncreateoptionsmenu(menu menu)
want override method in application activity class. have been restricted not change original code, , make changes via aspect . want know there way through can add method code through aspectj's pointcut.
here android file 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); } }
i want following method add in above code via pointcut :
@override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.sampleactivity, menu); return true; }
so if possible suggest me pointcut achive above things.
thank u in advance . .
basically agree @pskink's comments: if can extend class , override methods preferable using "heavy artillery" such aspectj. understand want manipulate app not have source code , cannot inject subclass overridden method. if correct, understand need aspectj. here answer question:
well, not use android , lazy download full android jdk in order demonstrate solution, created fake example.
api base class:
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; } }
driver application:
as said, assuming app be commercial, cannot change behaviour conventional oop means. app overrides 1 api method, not 1 want.
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 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"); } }
sample output:
starting commercial app oncreate implementation overridden commercial app oncreateoptionsmenu default implementation stopping commercial app
aspect introducing desired method via itd (inter-type definition):
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 aspect"); return false; } }
sample output spect:
starting commercial app oncreate implementation overridden commercial app oncreateoptionsmenu implementation overridden aspect stopping commercial app
tadaa! should straightforward transfer situation.
Comments
Post a Comment