Advanced AspectJ ja AspectJ 5.0 Aleksei Bogdanov 05. aprill 2006

Seotud dokumendid
PowerPointi esitlus

loeng2

Süsteemide modelleerimine: praktikum Klassiskeemid Oleg Mürk

Funktsionaalne Programmeerimine

I Generaatori mõiste (Java) 1. Variantide läbivaatamine Generaator (ehk generaator-klass) on klass, milles leidub (vähemalt) isendimeetod next(). Kons

PowerPointi esitlus

Andmeturve

Scala ülevaade 1 Meetodid, muutujad ja väärtused. Süntaks 2 Lihtsad tüübid ja väärtused. 3 OOP, case-klassid ja mustrisobitus. 4 Puhta Scala väärtusta

Microsoft Word - ref - Romet Piho - Tutorial D.doc

Infix Operaatorid I Infix operaatorid (näiteks +) ja tüübid (näiteks ->) kirjutatakse argumentide vahele, mitte argumentide ette. Näiteks: 5 + 2, 2*pi

HAJUSSÜSTEEMID HAJUSSÜSTEEMID Kaugprotseduurid IDL kompileerimine ONCIDLnäide CORBAIDLnäide MIDLnäide DCERPCmuidomadusi XML-RPC JSON-RPC REST document

PHP

Algoritmid ja andmestruktuurid

SQL

SQL

(loeng3-ohtlikud_koodiloigud)

Microsoft Word - EVS_ISO_IEC_27001;2014_et_esilehed.doc

SAF 7 demo paigaldus. 1.Eeldused SAF 7 demo vajab 32- või 64-bitist Windows 7, Window 8, Windows 10, Windows Server 2008 R2, Windows Server 2012, Wind

ITI Loogika arvutiteaduses

Word Pro - diskmatTUND.lwp

1. AKE Ajalise keerukuse empiiriline hindamine

Pealkiri

Funktsionaalne Programmeerimine

Image segmentation

Andmed arvuti mälus Bitid ja baidid

Failiotsing: find paljude võimalustega otsingukäsk find kataloog tingimused kataloog - otsitakse sellest kataloogist ja tema alamkataloogidest tingimu

Müük (Microsoft Dynamics AX (Axapta) tarkvara) Paigaldusjuhend bifree.ee qlik.com

EBSCO täistekstiandmebaaside kasutamine Otsingu sooritamiseks: 1. Logi sisse 2. Vali EBSCOhost Web 3. Seejärel vali andmebaas, milles soovid otsingut

Microsoft Word - Referaat.docx

Operatsioonisüsteemi ülesanded

(Microsoft PowerPoint - seminar_6_n\365uded-ainemudel tagasiside.ppt [Compatibility Mode])

raamat5_2013.pdf

EE-macbook-retina-12-early2015-qs.indd

Microsoft PowerPoint - loeng2.pptx

Loeng07

HAJUSSÜSTEEMID HAJUSSÜSTEEMID SOAP ja veebiteenused Web Services Web Services SOAP WSDL Ühilduvus UDDI Kihiline arhitektuur masinsuhtluse jaoks erinev

Andmeturve

ArcGIS rakendused välitöödeks Raido Valdmaa AlphaGIS

8.klass 4 tundi nädalas, kokku 140 tundi Hulkliikmed ( 45 tundi) Õppesisu Hulkliige. Hulkliikmete liitmine ja lahutamine ning korrutamine ja jagamine

Microsoft PowerPoint - TÜ TVT - Kavandamine ja arhitektuur 2.ppt

Elisa Ring Elisa Ringi mobiilirakendus Versioon

Matemaatiline analüüs IV 1 3. Mitme muutuja funktsioonide diferentseerimine 1. Mitme muutuja funktsiooni osatuletised Üleminekul ühe muutuja funktsioo

Pealkiri

GRUPI-SMS Veebirakenduse kasutamise juhend Rakendus Elisa grupi-smsi rakendus Väljaandja Elisa Eesti AS Juhendi koostamise kuupäev Versioon

Microsoft PowerPoint - loeng.ppt

HAJUSSÜSTEEMID HAJUSSÜSTEEMID Veebiteenused ja SOAP Web Services Web Services SOAP WSDL Ühilduvus UDDI Kihiline arhitektuur masinsuhtluse jaoks erinev

Programmeerimiskeel APL Raivo Laanemets 17. mai a.

loeng7.key

X Window System tuntud kui: X11 X X-Windows akendussüsteem/akendesüsteem rastergraafikat toetavatele ekraanidele UNIX-maailmas väga levinud mitmesugus

lvk04lah.dvi

G aiasoft Programmi VERP ja Omniva Arvekeskuse liidese häälestamine ja arvete saatmine-lugemine VERP 6.3 ja VERP 6.3E Versioon ja hilisemad K

1 / loeng Tekstitöötlus Sisend/väljund Teksti lugemine Sõnad

vv05lah.dvi

Tartu Ülikool Loodus- ja täppisteaduste valdkond Arvutiteaduse instituut Sandra Puusepp CVE Referaat Tartu 2018

Title H1

AWK Aho Weinberger Kernighan struktuurse teksti töötlemise keel rikkalikult tekstitöötlusvahendeid omal alal suhteliselt lihtne ja kiiresti realiseeri

Operatsioonisüsteemide ehitus

MTAT Operatsioonisüsteemid - Turvalisus

Hoia oma arvuti turvaline ja kiire 1.Leia start nupust alustades Juhtpaneel 2.Juhtpaneeli aadressiribalt leia Kõik juhtpaneeli üksused 3.Avanenud tööa

IVXV võtmerakendus Spetsifikatsioon Versioon jaan lk Dok IVXV-SVR-1.4.0

Slide 1

Microsoft Word - TallinnLV_lihtsustatud_manual_asutuse_juhataja_ doc

PowerPointi esitlus

MTAT Operatsioonisüsteemid - Turvalisus

BIM360 ja RealityCapture

Sügis 2018 Kõrgema matemaatika 2. kontrolltöö tagasiside Üle 20 punkti kogus tervelt viis üliõpilast: Robert Johannes Sarap, Enely Ernits, August Luur

PÄRNU TÄISKASVANUTE GÜMNAASIUM ESITLUSE KOOSTAMISE JUHEND Pärnu 2019

Control no:

Norrison Ametikudumid, Professional knitwear.cdr

Diskreetne matemaatika I Kevad 2019 Loengukonspekt Lektor: Valdis Laan 20. juuni a.

IMO 2000 Eesti võistkonna valikvõistlus Tartus, aprillil a. Ülesannete lahendused Esimene päev 1. Olgu vaadeldavad arvud a 1, a 2, a 3,

DIGITAALTEHNIKA DIGITAALTEHNIKA Arvusüsteemid Kümnendsüsteem Kahendsüsteem Kaheksandsüsteem Kuueteistkü

Tiia Salm 2011 Online kirjastus CALAMÉO Calameo kujutab endast on-line kirjastust, mis võimaldab oma dokumente avaldada e-raamatuna tasuta. Failid (Pd

PowerPoint Presentation

Mining Meaningful Patterns

Linux süsteemi administreerimine

Microsoft Word - Errata_Andmebaaside_projekteerimine_2013_06

Inglise keele ainekava 9.klassile Kuu Õpitulemused Õppesisu Kohustuslik hindamine September 1. Kasutab Present Simple, Present Mina ja teised. Inimese

E-arvete juhend

Pangalingi spetsifikatsioon Pocopay pangalingilt makse algatamiseks tuleb kasutada teenust Kaupmees teeb päringu Pocopayle aadressile

Tallinna Ülikool Digitehnoloogiate instituut JavaFX rakenduste kujundamine CSS abil Seminaritöö Autor: Hendrik Spiegelberg Juhendaja: Jaagup Kippar Au

Microsoft Word - Loppukilpailu2015_16_tehtavat_viro_1

Automaatjuhtimise alused Automaatjuhtimissüsteemi kirjeldamine Loeng 2

Müügiarvete juhend VEP_

Skriptimiskeeli, mida ei käsitletud Perl Python Visual Basic Script Edition (VBScript) MS DOS/cmd skriptid Windows PowerShell midagi eksootilisemat: G

E-arvete saatmine SAFist - üldist E-arvete saatmine riigifirmadele toimub e-arvete operaatorite kaudu, e-arveid otse saata pole võimalik. Operaatori k

TARTU ÜLIKOOL Arvutiteaduse instituut Informaatika õppekava Mirjam Iher Nõrgima eeltingimuse staatiline analüüs pinukeeltele Bakalaureusetöö (9 EAP) J

Microsoft Word - EVS-ISO doc - pdfMachine from Broadgun Software, a great PDF writer utility!

HAJUSSÜSTEEMID HAJUSSÜSTEEMID Nimeteenuse näited DNS DNS NIS NIS+ LDAP JNDI Hierarhiline Interneti nimede süsteem Põhilised päringud: Arvuti nime järg

Microsoft Word - C035736e.doc

Väljumismanifesti teenused

Kehtiv alates Vormi TSD lisa 3 Applicable from Annex 3 of Form 3 Unofficial translation Maksu- ja Tolliamet Estonian Tax and Cus

Mida me teame? Margus Niitsoo

Väljavõte:

Advanced AspectJ ja AspectJ 5.0 Aleksei Bogdanov a1exey1@ut.ee 05. aprill 2006

Kava AspectJ in Action, peatükk 4 The AspectJ 5 Development Kit Developer's Notebook AOP@Work: AOP and metadata: A perfect match

Advanced AspectJ

Advanced AspectJ Reflective API Aspektide eelnevus (Aspect precedence) Aspektide seostumine (Aspect association) Erindite pehmendamine (Exception softening) Privilegeeritud aspektid (Priveleged aspects)

Reflective API Liidesed, mis tagavad juurdepääsu ühendpunktiga seotud dünaamilisele ja staatilisele infole Dünaamiline info on kättesaadav ka lõikepunktide this(), target() ja args() kaudu Reflective API keerulisem kuid pakub rohkem võimalusi

Ühendpunktiga seotud objektid thisjoinpoint ühendpunkti dünaamiline info (käsitletav objekt, sihtobjekt, meetodi argumendid) thisjoinpointstaticpart ühendpunkti staatiline info (signatuur, tüüp, asukoht koodis) thisenclosingjoinpointstaticpart ümbritseva ühendpunkti staatiline info

org.aspectj.lang.joinpoint liidese meetodid getthis() gettarget() getargs() getstaticpart()

org.aspectj.lang.joinpoint. StaticPart liidese meetodid getkind() getsignature() getsourcelocation()

Reflective API: näide public class Test { public static void main(string[] args) { SavingsAccount account = new SavingsAccount(12456); account.credit(100);

import org.aspectj.lang.*; import org.aspectj.lang.reflect.*; public aspect JoinPointTraceAspect { private int _indent = -1; pointcut tracepoints() :!within(joinpointtraceaspect) &&!call(*.new(..)) &&!execution(*.new(..)) &&!initialization(*.new(..)) &&!staticinitialization(*); before() : tracepoints() { _indent++; println("========= " + thisjoinpoint + " ==========="); println("dynamic join point information:"); printdynamicjoinpointinfo(thisjoinpoint); println("static join point information:"); printstaticjoinpointinfo(thisjoinpointstaticpart); println("enclosing join point information:"); printstaticjoinpointinfo(thisenclosingjoinpointstaticpart);

private void printdynamicjoinpointinfo(joinpoint joinpoint) { println("this: " + joinpoint.getthis() + " Target: " + joinpoint.gettarget()); StringBuffer argstr = new StringBuffer("Args: "); Object[] args = joinpoint.getargs(); for (int length = args.length, i = 0; i < length; ++i) { argstr.append(" [" + i + "] = " + args[i]); println(argstr); private void printstaticjoinpointinfo( JoinPoint.StaticPart joinpointstaticpart) { println("signature: " + joinpointstaticpart.getsignature() + " Kind: " + joinpointstaticpart.getkind()); SourceLocation sl = joinpointstaticpart.getsourcelocation(); println("source location: " + sl.getfilename() + ":" + sl.getline());

========= call(void Account.credit(float)) =========== Dynamic join point information: This: null Target: SavingsAccount@1ad086a Args: [0] = 100.0 Static join point information: Signature: void Account.credit(float) Kind: method-call Source location: Test.java:4 Enclosing join point information: Signature: void Test.main(String[]) Kind: method-execution Source location: Test.java:3 ========= execution(void Account.credit(float)) =========== Dynamic join point information: This: SavingsAccount@1ad086a Target: SavingsAccount@1ad086a Args: [0] = 100.0 Static join point information: Signature: void Account.credit(float) Kind: method-execution Source location: Account.java:12 Enclosing join point information: Signature: void Account.credit(float) Kind: method-execution Source location: Account.java:12

Aspektide eelnevus Võib olla vajalik juhul kui ühele ühendpunktile rakendub rohkem kui üks aspekt Eelnevuse spetsifitseerimata on aspektide rakendamise järjekord juhuslik AspectJ lubab aspektide eelnevust määrata

Eelnevusreeglid

Aspektide eelnevus: süntaks declare precedence : TypePattern1, TypePattern2,..; Näited: declare precedence : AuthenticationAspect, AuthorizationAspect; declare precedence : AuthenticationAspect, *; declare precedence : *, CachingAspect;

Juhiste eelnevus Kui ühele ühendpunktile rakendub mitu sama aspekti juhist, siis esimesena rakendub see juhis mis paikneb aspektis eespool

Aspektide seostumine Üks isend aspektist virtuaalmasina kohta (per virtual machine) (vaikimisi) Üks isend aspektist iga objekti kohta (per object) Üks isend aspektist töövoo kohta (per controlflow) Üks isend aspektist tüübimalli kohta (per type pattern) (AspectJ 5.0)

Aspekti seostumine: süntaks aspect <AspectName> [<associationspecifier>(<pointcut>)] {... aspect body Näide: public abstract aspect CacheManagementAspect perthis(access()) {...

Vaikimisi seostumine: näide public aspect AssociationDemoAspect { public AssociationDemoAspect() { System.out.println("Creating aspect instance"); pointcut accountoperationexecution(account account) : (execution(* Account.credit(..)) execution(* Account.debit(..))) && this(account); before(account account) : accountoperationexecution(account) { System.out.println("JoinPoint: " + thisjoinpointstaticpart + "\n\taspect: " + this + "\n\tobject: " + account);

public class TestAssociation { public static void main(string[] args) throws Exception { SavingsAccount account1 = new SavingsAccount(12245); SavingsAccount account2 = new SavingsAccount(67890); account1.credit(100); account1.debit(100); account2.credit(100); account2.debit(100);

> ajc *.java > java TestAssociation Creating aspect instance JoinPoint: execution(void Account.credit(float)) aspect: AssociationDemoAspect@187aeca object: SavingsAccount@e48e1b JoinPoint: execution(void Account.debit(float)) aspect: AssociationDemoAspect@187aeca object: SavingsAccount@e48e1b JoinPoint: execution(void Account.credit(float)) aspect: AssociationDemoAspect@187aeca object: SavingsAccount@12dacd1 JoinPoint: execution(void Account.debit(float)) aspect: AssociationDemoAspect@187aeca object: SavingsAccount@12dacd1

Kahte tüüpi: perthis() per-object seostumine aspekti isend seostub ühendpunkti objektiga this argumendiga määratud lõikepunktis pertarget() aspekti isend seostub ühendpunkti objektiga target argumendiga määratud lõikepunktis Seostumine toimub hetkel, kui aspekt rakendub antud objektile esimest korda

per-object seostumine: näide public aspect AssociationDemoAspect perthis(accountoperationexecution(account)) { public AssociationDemoAspect() { System.out.println("Creating aspect instance"); pointcut accountoperationexecution(account account) : (execution(* Account.credit(..)) execution(* Account.debit(..))) && this(account); before(account account) : accountoperationexecution(account) { System.out.println("JoinPoint: " + thisjoinpointstaticpart + "\n\taspect: " + this + "\n\tobject: " + account);

> ajc *.java > java TestAssociation Creating aspect instance JoinPoint: execution(void Account.credit(float)) aspect: AssociationDemoAspect@e48e1b object: SavingsAccount@12dacd1 JoinPoint: execution(void Account.debit(float)) aspect: AssociationDemoAspect@e48e1b object: SavingsAccount@12dacd1 Creating aspect instance JoinPoint: execution(void Account.credit(float)) aspect: AssociationDemoAspect@1ad086a object: SavingsAccount@10385c1 JoinPoint: execution(void Account.debit(float)) aspect: AssociationDemoAspect@1ad086a object: SavingsAccount@10385c1

per-control-flow seostumine Kahte tüüpi seostumine: percflow() aspekti isend seostub töövooga (control flow) lõikepunkti rahuldavas ühendpunktis percflowbelow() aspekti isend seostub ühendpunkti järgneva töövooga lõikepunkti rahuldavas ühendpunktis

per-control-flow seostumine: näide public aspect AssociationDemoAspect percflow(accountoperationexecution(account)) { public AssociationDemoAspect() { System.out.println("Creating aspect instance"); pointcut accountoperationexecution(account account) : (execution(* Account.credit(..)) execution(* Account.debit(..))) && this(account); before(account account) : accountoperationexecution(account) (execution(* Account.setBalance(..)) && this(account)) { System.out.println("JoinPoint: " + thisjoinpointstaticpart + "\n\taspect: " + this + "\n\tobject: " + account);

> ajc *.java > java TestAssociation Creating aspect instance JoinPoint: execution(void Account.credit(float)) aspect: AssociationDemoAspect@10385c1 object: SavingsAccount@42719c JoinPoint: execution(void Account.setBalance(float)) aspect: AssociationDemoAspect@10385c1 object: SavingsAccount@42719c Creating aspect instance JoinPoint: execution(void Account.debit(float)) aspect: AssociationDemoAspect@30c221 object: SavingsAccount@42719c JoinPoint: execution(void Account.setBalance(float)) aspect: AssociationDemoAspect@30c221 object: SavingsAccount@42719c

Creating aspect instance JoinPoint: execution(void Account.credit(float)) aspect: AssociationDemoAspect@119298d object: SavingsAccount@f72617 JoinPoint: execution(void Account.setBalance(float)) aspect: AssociationDemoAspect@119298d object: SavingsAccount@f72617 Creating aspect instance JoinPoint: execution(void Account.debit(float)) aspect: AssociationDemoAspect@1e5e2c3 object: SavingsAccount@f72617 JoinPoint: execution(void Account.setBalance(float)) aspect: AssociationDemoAspect@1e5e2c3 object: SavingsAccount@f72617

per-type-pattern seostumine pertypewithin() aspekti isend seostub tüübiga, mis rahuldab etteantud tüübimalli Kasulik juhul, kui on vaja säilitada olekut iga tüübi jaoks mingist tüüpide hulgast Näide: public aspect InstanceTracking pertypewithin(org.xyz..*) {...

Erindite pehmendamine Annab võimaluse käsitleda ühendpunkti poolt tekitatud kontrollitav erindit (checked exception) kontrollimata erindina (unchecked exception) Kaob vajadus erindit töödelda või panna see meetodi spetsifikatsiooni Erindite töötlemise ühte kohta koondamine

Erindi pehmendamine: süntaks declare soft : <ExceptionTypePattern> : <pointcut>; Näide: declare soft: RemoteException : call(* Foo.*(..));

Erindi pehmendamine: näide import java.rmi.remoteexception; public class TestSoftening { public static void main(string[] args) { TestSoftening test = new TestSoftening(); test.perform(); public void perform() throws RemoteException { throw new RemoteException(); public aspect SofteningTestAspect { declare soft : RemoteException : call(void TestSoftening.perform());

import java.rmi.remoteexception; public class TestSoftening { public static void main(string[] args) { TestSoftening test = new TestSoftening(); try { test.perform(); catch (RemoteException ex) { throw new SoftException(ex); public void perform() throws RemoteException { throw new RemoteException();

Privilegeeritud aspektid Annavad võimaluse Java juurdepääsu reeglitest üle saada Juurdepääs klassi private väljadele Süntaks: privileged public aspect PrivilegeTestAspect {...

AspectJ 5

Mis on AspectJ 5? Olulised muudatused keeles ja vahendites Java 5 toetamine AspectJ võimaluste laiendamine

AspectJ 5 Annotatsioonid (Annotations) Klassimallid (Generics) per-type-pattern seostumine Laadimisaegne põimimine (load-time weaving) Muud võimalused

Annotatsioonid Programmi liikmete metainfo väljendamiseks Saab rakendada pakettide ja tüüpide deklaratsioonidele, konstruktoritele, meetoditele, väljadele, parameetritele ja muutujatele Näide: @Authenticated(role="supervisor") public void somemethod() {...

Annotatsioonid ja AspectJ AspectJ lubab lisada annotatsioone aspektidele, meetoditele, klassi- ja isendiväljadele, konstruktoritele, parameetritele ja juhistele Võimalus kasutada annotatsioone ühendpunkti sobitamisel

Elementide mallid Nime järgi: @<qualified-name> @Immutable @Foo @Goo Malli järgi: @(<type-pattern>) @(Foo Goo) @(org.xyz..*)

Tüüpide mallid (@Immutable *) ((@Immutable Foo+) Goo) (@Immutable @NonPersistent org.xyz..*)

Signatuuride mallid @SensitiveData * * @SensitiveData List org.xyz..*.* @Oneway * *(..) * *.*(@Immutable *,..)

Dünaamiline kontekst @this @target @args @within @withincode @annotation call(* *(..)) && @target(classified)

Näited within(@secure *) call(@oneway * *(..)) set(@cachable * *) pointcut insidecriticalmethod(critical c) : @withincode(c); declare parents : (@Secured *) implements SecuredObject; declare precedence : (@Security *),*;

Annotatsioonide kasutamine Metaandmete esitamine @Transactional(kind=Required) public void credit(float amount) {... Lihtsamini hallatavad lõikepunktid public pointcut transactedops() : execution(@transactional * *.*(..));

Annotatsioonide kasutamine Annotatsiooniga varustamine (supplying annotation) declare annotation : * Account.*(..) : @Authenticated(permission="banking"); Annotatsioonide tarbimine (consuming annotation) pointcut transactedops() : execution(@transactional * *.*(..));

Mitmedimensionaalne signatuur

AspectJ annotatsioonid @Aspect public class Foo { @Aspect("perthis(execution(* abc..*(..)))") public class Foo { @Pointcut("call(* *.*(..))") void anycall() { @Before("call(* org.aspectprogrammer..*(..)) && this(foo)") public void callfromfo{ System.out.println("Call from Foo");

Klassimallid (generics) public interface List<E> { Iterator<E> iterator(); void add(e anitem); E remove(e anitem);

Klassimallide parameetrid class Foo<T> {... class Foo<T,S> {... class Foo<T extends Number> {... class Foo<T extends Number & Comparable> {...

Klassimallide väärtustamine List<String> List<?> List<? extends Number> List<? super Double>

Klassimallid ja AspectJ Klassimallide tugi lõikepunktide ja aspektide defineerimisel Võimalus luua abstraktsete aspektide klassimalle Sobitamine lõikepunkti avaldises toimub tüübi kustutamise (erasure) põhimõttel.

Näide class C { public void foo(list<? extends Number> listofsomenumbertype) { public void bar(list<?> listofsometype) { public void goo(list<double> listofdoubles) {

execution(* C.*(List)) execution(* C.*(List<?>)) execution(* C.*(List<? extends Object+>)) args(list<double>)

Aspektide klassimallid (generic aspects) Saab defineerida ainult abstraktsete aspektide jaoks Näide: public abstract aspect ParentChildRelationship<P,C> {...

Lisaks AspectJ tugi muudele uuendustele: Autoboxing ja unboxing Varargs Covariance Loendid (enumerations)

Laadimisaegne põimimine (load-time weaving) Põimimine lükatakse edasi kuni klassi laadimiseni virtuaalmasinasse "weaving class loader"

Küsimused