Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] around advice not matching with finalize method

Hi Andy and Federico,
couldn't "hasmethod" be used here?
public static interface HandledFinalize {
       public void finalize();
   }
public void HandledFinalize.finalize() {
       super.finalize();
   }
declare parents : !hasmethod(public void finalize()) implements HandledFinalize; after() : execution(public void *.finalize()) { }

Obviously you need the -XhasMember compiler option to support hasMethod and hasField.

Basically you "inject" a finalize method where it is not declared, and then normally advice it to give it a more useful body.

Obviously, it will not work on "any class", but an any weave-able class yes :)

I must admit I haven't tested it, but compiles and could be a way. I used something similar before, but not on finalize methods.

Hope it helps,
Simone

Andy Clement wrote:
I see.  Yes, unless Object is woven, you won't be able to advise
methods within it.  And I wouldn't recommend weaving Object.

Usually in this case you can switch to weaving the call join point -
but calls to finalize won't be in your control either.

Andy

2009/6/8 Federico Firpo Bodner <federico@xxxxxxxxxxxx>:
Hi Andy,

       That's correct, but only because A.class are overriding the
finalize() method, but the pointcut doesn't match for any class with the
inerithed finalize from java.lang.Object. I want to advice any class when is
garbage collected, but apparently is not possible with the finalize method.
I did it implementing a Phantom References queue, which generates a lot of
memory consumption.

Thanks anyway, Federico.


-----Mensaje original-----
De: aspectj-users-bounces@xxxxxxxxxxx
[mailto:aspectj-users-bounces@xxxxxxxxxxx] En nombre de Andy Clement
Enviado el: lunes, 08 de junio de 2009 18:25
Para: aspectj-users@xxxxxxxxxxx
Asunto: Re: [aspectj-users] around advice not matching with finalize method

Hi Frederico,

I just tried it and it worked for me:

--- A.java ---
public class A {

 public static void main(String[]argv) {
   new A().create();
   System.gc();
 }

 private void create() {
   for (int i=0;i<1000;i++) { new A();
   }
}

 protected void finalize() throws Throwable {

   System.err.println("Finalized");
 }
}
aspect X {
 before(Object o): execution(!static * finalize(..)) && this(o) {
   System.out.println("("+o+")");
 }
}
--- End of A.java ---

java A
(A@9ed927)
Finalized
(A@c2a132)
Finalized
(A@1e51060)
Finalized
(A@19616c7)
Finalized
(A@b166b5)
Finalized
(A@cdfc9c)
Finalized
(A@1837697)
Finalized
(A@1decdec)
Finalized
(A@a1807c)
Finalized
(A@fa7e74)
Finalized
(A@183f74d)
Finalized
(A@e102dc)
Finalized

Have you tried enabling -showWeaveInfo to see if the method is woven?

Andy

2009/5/29 pilux <federico@xxxxxxxxxxxx>:
Hi all,

   I'm trying to write an aspect for controlling every custom classes
loaded. So, i've written a pointcut to exclude th system classes:

   public pointcut SystemExclusions() : !within(weblogic..*) &&
!within(sun..*) && !within(org.apache..*) && !within(com.ibm..*) &&
!within(*..*ogger*..*)
   && !within(AbstractMonitor+) && !within(glassbox..*) &&
!within(org.aspectj..*) && !within(net.sf.hibernate..*)
   && !within(com.rsa..*) && !within(org.jboss..*) &&
!within(org.eclipse..*) && !within(org.osgi..*) &&
!within(com.bea.console..*)
   && !within(edu.emory.mathcs.util..*) && !within(uk.ltd.getahead.dwr..*)
&& !within(org.hsqldb..*) && !within(org.spring*..*);

   And another one for capturing the classes load:

   /* Clases */
   after() returning(Object o): call(!static Object+.new(..)) && this(*)
&&
SystemExclusions()
   {
       //String key = findClassName(thisJoinPointStaticPart.toString());
       String key = o.getClass().getName();
       if(LocalDebug && false) System.err.println("[Pilux-Lucierna***] Se
ha cargado una instancia de la clase: " + key);
       registerInstanceLoad(key, false);
       iterationsOcurred.increment();
       if (iterationsOcurred.getValue() >= dumpFrequency)
           reportConsoleOperations();
   }

   This is working fine, but for decrease the loaded classes counter, i'm
trying to capture the finalize() execution method, with this advice:

   void around(Object o) : execution(!static * finalize(..)) && this(o)
   {
       String key = o.getClass().getName();
       if(LocalDebug) System.err.println("[Pilux-Lucierna***] Se ha
descargado una instancia de la clase: " + key);
       registerInstanceLoad(key, true);
       iterationsOcurred.increment();
       if (iterationsOcurred.getValue() >= dumpFrequency)
           reportConsoleOperations();
       proceed(o);
   }

   I've overloaded a finalize() method from a custom class to force a
message console when the gc() calls it, and the method is currently
running,
but for any reason is not matching my pointcut. I'm running in an
evironment
with several aspects running, I don't know if this matter. Somebody can
help
me, please? I'll be very grateful!!!

Thanks!
Regards, Federico.
--
View this message in context:
http://www.nabble.com/around-advice-not-matching-with-finalize-method-tp2377
5987p23775987.html
Sent from the AspectJ - users mailing list archive at Nabble.com.

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users


--
Simone Gianni            CEO Semeru s.r.l.           Apache Committer
http://www.simonegianni.it/



Back to the top