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.htmlfor > >>>> >> 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
