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

Reply via email to