Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-dev] Can I intercept before a class is load time weaved

Hi Choudary,
Martin is absolutely right, you need to :
- Implement your own classloader
- Use the weaving adaptor from there
- Decide which classes you want to pass to the adaptor and which you don't want to - To make this check, either use BCEL/ASM, or load the class in a temporary classloader

This last point is what you are asking for, to use reflection instead of ASM/BCEL. You don't really have to, ASM/BCEL can quite easily check for the presence of a static field in bytecode, and it's much much faster than using reflection for this, but if you really want to, you can still load the class in a temporary classloader (you can use an URLClassLoader), check it there and the load it in your real classloader with or without passing it to the weaving adaptor. The problem is that playing with classloaders this way is a bit tricky; not impossible or extremely difficult, just tricky, which means you could spend hours trying to figure out why things are not working as you expect before understanding what is really happening.

If you want to, I have played a bit with AspectJ LTW classloading, you can find some stuff here http://svn.apache.org/repos/asf/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ . What you find there is a way to pipe a number of transformations (AspectJ weaver -> OpenJPA enhancer -> Cobertura enhancer) and then load the resulting class in the final classloader (in my case a webapp classloader). It works in "pull mode", that is when the webapp classloader searches for a class, it will search for a resource a/b/C.class to load the bytecode. When this happen, the chain of transformers kick in, each pulling bytecode from the previous one, so that the bytecode travels from the .jar file, via aspectj, openjpa etc.. to the classloader requiring it.

Some of these transformers (including AspectJ) uses temporary classloaders in the middle. Maybe you can use that as a starting point and the add proper "if" statements to bypass aspectj weaver for classes you don't need.

The code that build the chain and uses it is found here http://svn.apache.org/repos/asf/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRun.java inside the execute() method.

Hope this helps,
Simone

Choudary Kothapalli wrote:
This question follows the thread on InvalidClassException while
deserializing classes without SUID. The link to that thread is
http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg02496.html .

I could not get rid of the exception and my only solution is to
exclude all those Serializable classes without SUID. I ask my users to
exclude those classes in aop.xml, but in a large legacy application,
it is a tedious process. I need to find a simpler solution.

A probable solution is to intercept just before weaving a class, check
if that class is Serializable without SUID and if so, not to weave it.
This would need two things:

1. Ability to intercept just before a class is load time weaved. In
this 'advice', the normal class should be available so that a check
can be made for SUID using java reflection.
2. Ability to proceed without weaving if I don't want to weave that class.

I don't find a way to do this currently. By the time
'staticinitialization' is intercepted, the class may be weaved
already.

Again, I don't think this is any problem with AspectJ. It is just
something I need and I am checking if you could offer any solution
with your knowledge of AspectJ implementation.

Thanks,
Choudary Kothapalli.
_______________________________________________
aspectj-dev mailing list
aspectj-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-dev


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



Back to the top