|
View:
New views
5 Messages
—
Rating Filter:
Alert me
|
|
|
How to use a constructor pointcut in a pertarget aspectHi,
I'm trying to log read and write accesses with aspectJ. To do this, I want to capture the constructor calls, read and write calls and close calls of, for example, RandomAccessFile objects. The logged data shall be saved inside the aspect. For this reason, I want to use pertarget to capture constructor invocations. The problem is, that the used pointcut doesn't seem to work; neither an aspect instance is created, nor the advice for the constructor is used; i get a "advice has not been applied" message. These are the pointcuts used to capture the constructor calls. public pointcut randomAccessFileCreation() : call(RandomAccessFile.new(..)); public pointcut writerCreation() : (call(FileWriter.new(..)) || call(PrintWriter.new(File,..)) || call(PrintWriter.new(String,..))); These pointcuts (and more, for example readerCreation() following the same principle) are joined with the newAspect() pointcut: public pointcut newAspect() : writerCreation() || randomAccessFileCreation(); The aspect is defined like this: public privileged aspect loggingAspect pertarget(newAspect()){ The advice belonging to the newAspect() pointcut: after() returning(Object obj) : newAspect(){ boundTo = obj; System.err.println("new Object " + boundTo); log.setTimeOpen(Calendar.getInstance().getTime()); } } In the constructor of the aspect, i print a log message, too. None of the log messages is printed during the execution of the program. What am i doing wrong here? Thanks Christoph _______________________________________________ aspectj-users mailing list aspectj-users@... https://dev.eclipse.org/mailman/listinfo/aspectj-users |
|
|
Re: How to use a constructor pointcut in a pertarget aspectHi Christoph,
Your problem here is that for call() pointcuts, there is no target object (ie- it is always null). The best way I can think of implementing your strategy is by using an internal map to keep track of boundTo objects. Can anyone think of a better solution? On Tue, Oct 13, 2009 at 6:55 AM, Christoph Kurrat <c.kurrat@...> wrote: > Hi, > > I'm trying to log read and write accesses with aspectJ. > To do this, I want to capture the constructor calls, read and write calls > and close calls of, for example, RandomAccessFile objects. > The logged data shall be saved inside the aspect. For this reason, I want to > use pertarget to capture constructor invocations. The problem is, that the > used pointcut doesn't seem to work; neither an aspect instance is created, > nor the advice for the constructor is used; i get a "advice has not been > applied" message. > > These are the pointcuts used to capture the constructor calls. > > public pointcut randomAccessFileCreation() : call(RandomAccessFile.new(..)); > public pointcut writerCreation() : (call(FileWriter.new(..)) || > call(PrintWriter.new(File,..)) || call(PrintWriter.new(String,..))); > > These pointcuts (and more, for example readerCreation() following the same > principle) are joined with the newAspect() pointcut: > > public pointcut newAspect() : writerCreation() || > randomAccessFileCreation(); > > > The aspect is defined like this: > public privileged aspect loggingAspect pertarget(newAspect()){ > > > The advice belonging to the newAspect() pointcut: > after() returning(Object obj) : newAspect(){ > boundTo = obj; > System.err.println("new Object " + boundTo); > log.setTimeOpen(Calendar.getInstance().getTime()); > } > } > > In the constructor of the aspect, i print a log message, too. > > None of the log messages is printed during the execution of the program. > > What am i doing wrong here? > > Thanks > > Christoph > > _______________________________________________ > aspectj-users mailing list > aspectj-users@... > https://dev.eclipse.org/mailman/listinfo/aspectj-users > > aspectj-users mailing list aspectj-users@... https://dev.eclipse.org/mailman/listinfo/aspectj-users |
|
|
Re: How to use a constructor pointcut in a pertarget aspectHi Andrew,
thanks, i changed it in the suggested way. I've got one last question. I'm trying to capture the finalize calls of the IO objects. The pointcut(s) I use are these: public pointcut writerFinalize() : call(void finalize()) &&(target(FileWriter)||target(PrintWriter)); public pointcut randomAccessFileFinalize() : call(void finalize()) &&target(RandomAccessFile); public pointcut finalizeAll() : writerFinalize() || randomAccessFileFinalize() || ... the advice: after() : finalizeAll(){ System.err.println("finalize..."); close(thisJoinPoint.getTarget()); } I added the JRE to the inpath Again, the warning "advice has not been applied" occurs. Changing the pointcuts into execution-pointcuts, the warning disappears, although the advice isn't executed. In addition, I tried to change the advice into before(): finalizeAll(), without success. Is there a possibility to capture finalize at all? Or does the execution-pointcut apply and it is simply the VM that does not call finalize? Christoph 2009/10/13 Andrew Eisenberg <andrew@...> Hi Christoph, _______________________________________________ aspectj-users mailing list aspectj-users@... https://dev.eclipse.org/mailman/listinfo/aspectj-users |
|
|
Re: How to use a constructor pointcut in a pertarget aspectIt may be that finalize methods are being called from native code in
the jvm, so ajc will not be able to see them. But, in any case, it is very tricky to weave into the jre (I'm not even sure it is possible when running in Eclipse, because you might be forced to use the regular jre at runtime). If you absolutely must weave into the jre, then I'd suggest doing so from the command line: ajc -inpath rt.jar -outjar new_rt.jar MyAspect.java And then replacing your old rt.jar with the new one. And I believe it is entirely likely that the finalize methods are just not being called at all. You can try this out by adding some println statements in them and seeing if they are ever printed. On Wed, Oct 14, 2009 at 4:38 AM, Christoph Kurrat <c.kurrat@...> wrote: > Hi Andrew, > > thanks, i changed it in the suggested way. > > I've got one last question. I'm trying to capture the finalize calls of the > IO objects. > > The pointcut(s) I use are these: > > public pointcut writerFinalize() : call(void finalize()) > &&(target(FileWriter)||target(PrintWriter)); > public pointcut randomAccessFileFinalize() : call(void finalize()) > &&target(RandomAccessFile); > > public pointcut finalizeAll() : writerFinalize() || > randomAccessFileFinalize() || ... > > the advice: > > after() : finalizeAll(){ > System.err.println("finalize..."); > close(thisJoinPoint.getTarget()); > } > > I added the JRE to the inpath > > Again, the warning "advice has not been applied" occurs. > > Changing the pointcuts into execution-pointcuts, the warning disappears, > although the advice isn't executed. > In addition, I tried to change the advice into before(): finalizeAll(), > without success. > Is there a possibility to capture finalize at all? > Or does the execution-pointcut apply and it is simply the VM that does not > call finalize? > > Christoph > > > 2009/10/13 Andrew Eisenberg <andrew@...> >> >> Hi Christoph, >> >> Your problem here is that for call() pointcuts, there is no target >> object (ie- it is always null). The best way I can think of >> implementing your strategy is by using an internal map to keep track >> of boundTo objects. >> >> Can anyone think of a better solution? >> >> On Tue, Oct 13, 2009 at 6:55 AM, Christoph Kurrat >> <c.kurrat@...> wrote: >> > Hi, >> > >> > I'm trying to log read and write accesses with aspectJ. >> > To do this, I want to capture the constructor calls, read and write >> > calls >> > and close calls of, for example, RandomAccessFile objects. >> > The logged data shall be saved inside the aspect. For this reason, I >> > want to >> > use pertarget to capture constructor invocations. The problem is, that >> > the >> > used pointcut doesn't seem to work; neither an aspect instance is >> > created, >> > nor the advice for the constructor is used; i get a "advice has not been >> > applied" message. >> > >> > These are the pointcuts used to capture the constructor calls. >> > >> > public pointcut randomAccessFileCreation() : >> > call(RandomAccessFile.new(..)); >> > public pointcut writerCreation() : (call(FileWriter.new(..)) || >> > call(PrintWriter.new(File,..)) || call(PrintWriter.new(String,..))); >> > >> > These pointcuts (and more, for example readerCreation() following the >> > same >> > principle) are joined with the newAspect() pointcut: >> > >> > public pointcut newAspect() : writerCreation() || >> > randomAccessFileCreation(); >> > >> > >> > The aspect is defined like this: >> > public privileged aspect loggingAspect pertarget(newAspect()){ >> > >> > >> > The advice belonging to the newAspect() pointcut: >> > after() returning(Object obj) : newAspect(){ >> > boundTo = obj; >> > System.err.println("new Object " + boundTo); >> > log.setTimeOpen(Calendar.getInstance().getTime()); >> > } >> > } >> > >> > In the constructor of the aspect, i print a log message, too. >> > >> > None of the log messages is printed during the execution of the program. >> > >> > What am i doing wrong here? >> > >> > Thanks >> > >> > Christoph >> > >> > _______________________________________________ >> > aspectj-users mailing list >> > aspectj-users@... >> > https://dev.eclipse.org/mailman/listinfo/aspectj-users >> > >> > >> _______________________________________________ >> aspectj-users mailing list >> aspectj-users@... >> https://dev.eclipse.org/mailman/listinfo/aspectj-users > > > _______________________________________________ > aspectj-users mailing list > aspectj-users@... > https://dev.eclipse.org/mailman/listinfo/aspectj-users > > aspectj-users mailing list aspectj-users@... https://dev.eclipse.org/mailman/listinfo/aspectj-users |
|
|
Re: How to use a constructor pointcut in a pertarget aspectYou were right, the finalize methods are not called at all.
As a solution, I found the possibility to define shutdown hooks. 2009/10/14 Andrew Eisenberg <andrew@...> It may be that finalize methods are being called from native code in _______________________________________________ aspectj-users mailing list aspectj-users@... https://dev.eclipse.org/mailman/listinfo/aspectj-users |
| Free embeddable forum powered by Nabble | Forum Help |