I am using maven2 and AspectJ plugin. May be your scenario is better, you mean I register them and then somewhere else at runtime process them to create a map of events and related classes. thanks
On 4/28/10, Andy Clement <[email protected]> wrote: > > 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 > -- 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
