no error - so did your advice actually apply? Were there any markers in eclipse or weavinfo messages (if you built on the command line, Ant or load time weaving)? I suggested registering by name so you could drive the load of the class outside of the bean in your registration handling mechanism.
Andy On 28 April 2010 10:44, Mohammad Norouzi <[email protected]> wrote: > No Andy there is no error, actually the list of registered classes are > empty... it means no class has been registered itself. I need its Class > object because I want to read the @Observer(events = "SOME_EVENT") so I can > extract which events is binded to which classes (Session bean) and then I > can look them up when an event has been fired > > On 4/28/10, Andy Clement <[email protected]> wrote: >> >> Although AspectJ tries to create code that decompiles cleanly, there >> are some situations where it does not. The code is fine (otherwise >> you'd get a verifyerror), it is just the decompiler that cannot cope - >> I don't use them, I just read the bytecode :) Decompilers usually >> match on patterns and if you stray from a common pattern produced by >> javac, the decompiler will not understand. >> >> You still didn't mention how it fails.... do you get an error or is >> it just not running the advice? >> >> You could register the type by name rather than class reference if >> that makes any difference... >> >> >> Andy >> >> >> On 28 April 2010 10:14, Mohammad Norouzi <[email protected]> wrote: >> > Thank you Simone and Andy >> > Both pointcut and advice are exactly the same you suggested, at first I >> > thought there is a problem in advice which makes static block so, and >> > yes I >> > am using JD to decompile the code and as you found perhaps that >> > //ERROR// is >> > decompiler issue, if it is so, then my static block doesn't work... >> > >> > Well... As I understand you mean that if I load the class manually say >> > using >> > Class.forName() it will be ok however I will give it a try tomorrow but >> > I >> > think there are some issues.... first, this class is a EJB session bean >> > and >> > since it is a managed object by app server I am not sure if I can load >> > it >> > manually second... at deploy time, app server will load it, isn't that >> > enough? >> > >> > thank you for spending your time >> > >> > On 4/28/10, Simone Gianni <[email protected]> wrote: >> >> >> >> Hi Mohammad, >> >> I've found this page : http://java.decompiler.free.fr/?q=node/118 , it >> >> seems that JD produces the raw bytecode commented when it is not able >> >> to >> >> decompile it properly, which means that it is JD giving the error, not >> >> the >> >> code itself in error. I haven't been using JD lately, so I can't >> >> remember >> >> how to configure it properly, but the bytecode seems correct, so the >> >> problem >> >> must be somewhere else. >> >> Simone >> >> >> >> 2010/4/28 Simone Gianni <[email protected]> >> >>> >> >>> Hi Mohammad, >> >>> mmm ... the decompiled bytecode seems correct : it creates a joinpoint >> >>> static part, then executes the previous static initializer (which is >> >>> empty), >> >>> and then calls the after advice both when an exception is raised and >> >>> when no >> >>> exception is raised. >> >>> Bytecode, AFAIK, cannot be commented out, is that the output of javap, >> >>> dj >> >>> or which other tool? >> >>> Obviously, static initializer is executed only when the class is >> >>> loaded >> >>> for the first time in the JVM, if it is not loaded it will not be >> >>> called and >> >>> the class not be registered. Java lacks a serious "service discovery" >> >>> system, cause for backward compatibility with applets classloaders >> >>> does not >> >>> have a method for "listing" the classpath, not to mention to list >> >>> which >> >>> classes are annotated with a specific annotations. Apt is the tool >> >>> that can >> >>> ease this pain, creating a text file from classes annotated with a >> >>> specific >> >>> annotation, but unfortunately it works at compile time, not at >> >>> runtime, >> >>> that's why there is still the need for files like persistence.xml in >> >>> JPA and >> >>> web.xml in jars. >> >>> To make a long story short, as Andy did in his code, somewhere you >> >>> must >> >>> still call "new ClassUnderObservation()" or at least >> >>> Class.forName("com.foo.ClassUnderObservation") or access a static >> >>> field or >> >>> method of that class to get it loaded by the jvm, otherwise no static >> >>> init, >> >>> no registration in the aspect. >> >>> Simone >> >>> >> >>> 2010/4/28 Andy Clement <[email protected]> >> >>>> >> >>>> You didn't mention how it fails?? Here is Simones code in a real >> >>>> program, appears to work. What is different about your code or that >> >>>> particular type? Perhaps narrow your pointcut to a specific type to >> >>>> test the registration logic is working before expanding it to cover >> >>>> more types? >> >>>> >> >>>> === A.aj === >> >>>> package com.foo; >> >>>> >> >>>> import java.lang.annotation.Retention; >> >>>> import java.lang.annotation.RetentionPolicy; >> >>>> import java.util.*; >> >>>> >> >>>> import org.aspectj.lang.reflect.InitializerSignature; >> >>>> >> >>>> @Retention(RetentionPolicy.RUNTIME) >> >>>> @interface Observer {} >> >>>> >> >>>> aspect A { >> >>>> public static void main(String[] args) { >> >>>> new C();new D(); new E(); >> >>>> } >> >>>> >> >>>> static List<Class> registry = new ArrayList<Class>(); >> >>>> >> >>>> pointcut observerKlasses(): staticinitialization(@Observer com..*); >> >>>> >> >>>> after(): observerKlasses() { >> >>>> InitializerSignature initsig = >> >>>> (InitializerSignature)thisJoinPointStaticPart.getSignature(); >> >>>> Class klass = initsig.getDeclaringType(); >> >>>> registry.add(klass); >> >>>> System.out.println("Registering "+klass); >> >>>> } >> >>>> >> >>>> } >> >>>> >> >>>> @Observer >> >>>> class C {} >> >>>> >> >>>> class D{} >> >>>> >> >>>> @Observer >> >>>> class E {} >> >>>> === >> >>>> ajc A.aj >> >>>> java A >> >>>> Registering class com.foo.C >> >>>> Registering class com.foo.E >> >>>> >> >>>> cheers, >> >>>> Andy >> >>>> >> >>>> On 28 April 2010 00:30, Mohammad Norouzi <[email protected]> wrote: >> >>>> > Hi Simone, >> >>>> > Thanks... I did what you said but there is a problem. During the >> >>>> > compile >> >>>> > there is no error but it seems the static block doesn't work. I >> >>>> > tried >> >>>> > to >> >>>> > decompile the target class to see what changes AspectJ has applied >> >>>> > and >> >>>> > I can >> >>>> > see a static block has been created but it is commented as follow: >> >>>> > >> >>>> > >> >>>> > // ERROR // >> >>>> > static >> >>>> > { >> >>>> > // Byte code: >> >>>> > // 0: new 87 org/aspectj/runtime/reflect/Factory >> >>>> > // 3: dup >> >>>> > // 4: ldc 88 >> >>>> > // 6: ldc 90 >> >>>> > // 8: invokestatic 96 java/lang/Class:forName >> >>>> > (Ljava/lang/String;)Ljava/lang/Class; >> >>>> > // 11: invokespecial 99 >> >>>> > org/aspectj/runtime/reflect/Factory:<init> >> >>>> > (Ljava/lang/String;Ljava/lang/Class;)V >> >>>> > // 14: astore_0 >> >>>> > // 15: aload_0 >> >>>> > // 16: ldc 101 >> >>>> > // 18: aload_0 >> >>>> > // 19: ldc 103 >> >>>> > // 21: ldc 90 >> >>>> > // 23: invokevirtual 107 >> >>>> > org/aspectj/runtime/reflect/Factory:makeInitializerSig >> >>>> > >> >>>> > >> >>>> > (Ljava/lang/String;Ljava/lang/String;)Lorg/aspectj/lang/reflect/InitializerSignature; >> >>>> > // 26: iconst_0 >> >>>> > // 27: invokevirtual 111 >> >>>> > org/aspectj/runtime/reflect/Factory:makeSJP >> >>>> > >> >>>> > >> >>>> > (Ljava/lang/String;Lorg/aspectj/lang/Signature;I)Lorg/aspectj/lang/JoinPoint$StaticPart; >> >>>> > // 30: putstatic 79 com/foo/listener/MyListener1:ajc$tjp_0 >> >>>> > Lorg/aspectj/lang/JoinPoint$StaticPart; >> >>>> > // 33: goto +28 -> 61 >> >>>> > // 36: astore_0 >> >>>> > // 37: aload_0 >> >>>> > // 38: instanceof 71 >> >>>> > // 41: ifeq +8 -> 49 >> >>>> > // 44: aload_0 >> >>>> > // 45: checkcast 71 java/lang/ExceptionInInitializerError >> >>>> > // 48: athrow >> >>>> > // 49: nop >> >>>> > // 50: invokestatic 77 >> >>>> > com/foo/aspect/EventDispatcherAspect:aspectOf >> >>>> > ()Lcom/foo/aspect/EventDispatcherAspect; >> >>>> > // 53: getstatic 79 com/foo/listener/MyListener1:ajc$tjp_0 >> >>>> > Lorg/aspectj/lang/JoinPoint$StaticPart; >> >>>> > // 56: invokevirtual 83 >> >>>> > >> >>>> > >> >>>> > com/foo/aspect/EventDispatcherAspect:ajc$after$com_foo_aspect_EventDispatcherAspect$1$5b3bc9fd >> >>>> > (Lorg/aspectj/lang/JoinPoint$StaticPart;)V >> >>>> > // 59: aload_0 >> >>>> > // 60: athrow >> >>>> > // 61: invokestatic 77 >> >>>> > com/foo/aspect/EventDispatcherAspect:aspectOf >> >>>> > ()Lcom/foo/aspect/EventDispatcherAspect; >> >>>> > // 64: getstatic 79 com/foo/listener/MyListener1:ajc$tjp_0 >> >>>> > Lorg/aspectj/lang/JoinPoint$StaticPart; >> >>>> > // 67: invokevirtual 83 >> >>>> > >> >>>> > >> >>>> > com/foo/aspect/EventDispatcherAspect:ajc$after$com_foo_aspect_EventDispatcherAspect$1$5b3bc9fd >> >>>> > (Lorg/aspectj/lang/JoinPoint$StaticPart;)V >> >>>> > // 70: return >> >>>> > // >> >>>> > // Exception table: >> >>>> > // from to target type >> >>>> > // 33 36 36 java/lang/Throwable >> >>>> > } >> >>>> > >> >>>> > Regards, >> >>>> > Mohammad >> >>>> > -------------------------- >> >>>> > Sun Certified Web Developer >> >>>> > ExpertsExchange Certified, Master: >> >>>> > http://www.experts-exchange.com/M_1938796.html >> >>>> > Have a look at some pictures @ http://pixelshot.wordpress.com/ >> >>>> > Do you like to read, see http://brainable.blogspot.com/ >> >>>> > For the Persians see http://fekre-motefavet.blogspot.com/ >> >>>> > English >> >>>> > >> >>>> > >> >>>> > Forum:http://n2.nabble.com/English-Phrase-Finder-For-Persians-f3274251.html >> >>>> > >> >>>> > >> >>>> > >> >>>> > >> >>>> > On Tue, Apr 27, 2010 at 7:33 PM, Simone Gianni <[email protected]> >> >>>> > wrote: >> >>>> >> >> >>>> >> Hi Mohammad, >> >>>> >> staticinitialization has no target object because when a class is >> >>>> >> initialized there is no instance yet. Probably you can obtain the >> >>>> >> class and >> >>>> >> other informations using ThisJoinPointStaticPart inside your >> >>>> >> advice. >> >>>> >> >> >>>> >> pointcut observerMethods(): >> >>>> >> staticinitialization(@Observer com..*); >> >>>> >> >> >>>> >> after(): observerMethods() { >> >>>> >> InitializerSignature initsig = >> >>>> >> (InitializerSignature)ThisJoinPointStaticPart.getSignature(); >> >>>> >> Class klass = initsig.getDeclaringType(); >> >>>> >> // adding 'klass' into Registry >> >>>> >> } >> >>>> >> >> >>>> >> See >> >>>> >> http://www.eclipse.org/aspectj/doc/released/runtime-api/index.html >> >>>> >> for >> >>>> >> more info. >> >>>> >> >> >>>> >> Simone >> >>>> >> >> >>>> >> 2010/4/27 Mohammad Norouzi <[email protected]> >> >>>> >>> >> >>>> >>> Hello >> >>>> >>> I want to register those classes annotated with @Observer in a >> >>>> >>> Registry >> >>>> >>> class... I want this occurs in a static block of such classes: >> >>>> >>> >> >>>> >>> pointcut observerMethods(Class klass): >> >>>> >>> staticinitialization(@Observer com..*) >> >>>> >>> && target(klass); >> >>>> >>> >> >>>> >>> after(Class klass): observerMethods(klass) { >> >>>> >>> // adding 'klass' into Registry >> >>>> >>> >> >>>> >>> } >> >>>> >>> >> >>>> >>> but as I read in manual it is said staticinitialization has no >> >>>> >>> target >> >>>> >>> object... is this right? if yes, how can I obtain the Class of >> >>>> >>> those >> >>>> >>> classes. Can I declare a static-block for matching classes? >> >>>> >>> >> >>>> >>> thanks >> >>>> >>> >> >>>> >>> Regards, >> >>>> >>> Mohammad >> >>>> >>> -------------------------- >> >>>> >>> Sun Certified Web Developer >> >>>> >>> Have a look at some pictures @ http://pixelshot.wordpress.com/ >> >>>> >>> >> >>>> >>> >> >>>> >>> >> >>>> >>> _______________________________________________ >> >>>> >>> aspectj-users mailing list >> >>>> >>> [email protected] >> >>>> >>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >>>> >>> >> >>>> >> >> >>>> >> >> >>>> >> _______________________________________________ >> >>>> >> aspectj-users mailing list >> >>>> >> [email protected] >> >>>> >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >>>> >> >> >>>> > >> >>>> > >> >>>> > _______________________________________________ >> >>>> > aspectj-users mailing list >> >>>> > [email protected] >> >>>> > https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >>>> > >> >>>> > >> >>>> _______________________________________________ >> >>>> aspectj-users mailing list >> >>>> [email protected] >> >>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >>> >> >> >> >> >> >> _______________________________________________ >> >> aspectj-users mailing list >> >> [email protected] >> >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >> >> > >> > >> > >> > -- >> > Regards, >> > Mohammad >> > -------------------------- >> > Sun Certified Web Developer >> > ExpertsExchange Certified, Master: >> > http://www.experts-exchange.com/M_1938796.html >> > Have a look at some pictures @ http://pixelshot.wordpress.com/ >> > Do you like to read, see http://brainable.blogspot.com/ >> > For the Persians see http://fekre-motefavet.blogspot.com/ >> > English >> > >> > Forum:http://n2.nabble.com/English-Phrase-Finder-For-Persians-f3274251.html >> > >> > >> > _______________________________________________ >> > aspectj-users mailing list >> > [email protected] >> > https://dev.eclipse.org/mailman/listinfo/aspectj-users >> > >> > >> _______________________________________________ >> aspectj-users mailing list >> [email protected] >> https://dev.eclipse.org/mailman/listinfo/aspectj-users > > > > -- > Regards, > Mohammad > -------------------------- > Sun Certified Web Developer > ExpertsExchange Certified, Master: > http://www.experts-exchange.com/M_1938796.html > Have a look at some pictures @ http://pixelshot.wordpress.com/ > Do you like to read, see http://brainable.blogspot.com/ > For the Persians see http://fekre-motefavet.blogspot.com/ > English > Forum:http://n2.nabble.com/English-Phrase-Finder-For-Persians-f3274251.html > > > _______________________________________________ > aspectj-users mailing list > [email protected] > https://dev.eclipse.org/mailman/listinfo/aspectj-users > > _______________________________________________ aspectj-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/aspectj-users
