[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
RE: [aspectj-users] AspectJ Runtime Hooks for Object Persistence
|
> ... it's not worth using AspectJ; you might as well just use
javassist.
>
You say that with such disdain, Wes. :-)
I think Javassist (and other MOP systems) and AspectJ are both equally
interesting and viable solutions, albeit to differing problems.
Ted Neward
Author, Instructor, Presenter: Java and .NET
http://www.neward.net/ted/weblog
http://www.javageeks.com
http://www.clrgeeks.com
> -----Original Message-----
> From: aspectj-users-admin@xxxxxxxxxxx [mailto:aspectj-users-
> admin@xxxxxxxxxxx] On Behalf Of Wes Isberg
> Sent: Saturday, March 08, 2003 10:55 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: Re: [aspectj-users] AspectJ Runtime Hooks for Object
Persistence
>
> Hi -
>
> > The only issue is how to assign these two aspects at runtime to
> whatever class I want
>
> If/since you're willing to write a class loader and weave at runtime,
> I'm sure you could
> figure out how to limit the class targets or regenerate the aspect on
> the fly. However,
> I strongly believe that all aspects should be defined before any
classes
> are, and that
> all aspects should apply to all classes. The cases where this is not
> true are so limited
> that it's not worth using AspectJ; you might as well just use
javassist.
>
> In any case, with your current interceptor delegate, you must have
code
> of the form: {interceptible}.setInterceptor(i);
> Perhaps that's the point at which to make runtime decisions. That
does
> imply
> every class in your package has the interceptor protocol built in. To
> reduce the cost
> for non-intercepted g/setters in the target package, change the
pointcut
> so the
> advice runs only when there is an interceptor (and don't set a default
> one):
> before(Interceptable i): getter(i) && if(null !=
i.getInterceptor())
> {
> i.getInterceptor().getField(i,
> thisJoinPoint.getSignature().getName());
> }
>
>
> Overall, it looks like you're taking a reflective approach and using
> AspectJ/AOP to wire it up.
> Your interceptors are limited to snooping (before advice); around
advice
> could change
> the actual values or flow of control. One alternative design is to
have
> the interceptor be the
> interface, rather than a delegate (assuming you don't have families of
> interceptors to
> interpose). Another is to put the snooping logic directly into the
> advice. Still another
> is to encapsule the idiom of checking getters/setters in an abstract
> aspect with template
> methods for the snooping, and then implement those for each type
> snooped; that gives
> you type-safe downwards casts so you can avoid reflection altogether.
> Also, then
> you could instantiate the concrete aspects using pertarget to get
> per-object state (e.g.,
> for journalling and rollback). And I'm sure there's more ways; I'd be
> surprised if there
> were less than 10 ways to do variants of interception in AspectJ.
>
> Have fun -
> Wes
>
> P.S. There's a new FAQ entry on the issue of runtime weaving and
> declarations:
> http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-
> home/doc/faq.html#q:loadtimeWeaving
>
> P.P.S. - LCD plain text emails preferred...
>
> "Sean R. Drucker" wrote:
>
> > AspectJ worked great. Below is what I came up with. The only issue
> > is how to assign these two aspects at runtime to whatever class I
want
> > (as apposed to declaring it statically). Anyone know were I can
> > look?Thanks... Seanaspect InterceptPointcuts { private
Interceptor
> > Interceptable.interceptor = Passthrough.DEFAULT; public void
> > Interceptable.setInterceptor(Interceptor i) {
> > interceptor = i == null ? Passthrough.DEFAULT : i;
> > }
> > public Interceptor Interceptable.getInterceptor() {
> > return interceptor;
> > } declare parents : persistence.objects.* implements
> > Interceptable;
> > }aspect Intercept { pointcut getter(Interceptable i):
> > get(!transient * (persistence.objects.*).*) && target(i);
> > pointcut setter(Interceptable i, Object value):
> > set(!transient * (persistence.objects.*).*) && target(i) &&
> > args(value); before(Interceptable i): getter(i) {
> > i.getInterceptor().getField(i,
> > thisJoinPoint.getSignature().getName());
> > } before(Interceptable i, Object value): setter(i, value) {
> > i.getInterceptor().setField(i,
> > thisJoinPoint.getSignature().getName(), value);
> > }}
> >
> > -----Original Message-----
> > From: aspectj-users-admin@xxxxxxxxxxx
> > [mailto:aspectj-users-admin@xxxxxxxxxxx]On Behalf Of Sean R.
> > Drucker
> > Sent: Saturday, March 01, 2003 9:48 AM
> > To: aspectj-users@xxxxxxxxxxx
> > Subject: [aspectj-users] AspectJ Runtime Hooks for Object
> > Persistence
> > Can anyone point me in the right direction for doing the
> > following (can AspectJ do this?): -At runtime, using
> > weaving, load a class and declareall field get and set
> > pointcuts for all non-transient fields in the class.
> > Obviously, field point-cuts from outside the class can not
> > be created as they require access to the calling code. This
> > is not an issue. -At runtime, be able to hook/unhook the
> > object with a single object to intercept the field
> > pointcuts. Only one hook object can be attached to the
> > weaved object at a time. Thanks... Sean Reasons for doing
> > this (if you care): -Developing a large object persistence
> > project (>100 classes).-Depending on the usage of the
> > persistence object, the fields will be loaded using
> > different fetching schemes. Therefore, the fields that need
> > to be intercepted (to do the background fetching) can vary
> > at runtime. Sample: public class Employee {
> > private String name;
> > private transient int setCount; public String
> > getName() {
> > return name;
> > }
> > public void setName(String name) {
> > setCount++;
> > this.name = name; // edge case
> > assert ((this.name = this.name) == this.name);
> > }} Could be weaved as follows:
> > public class Employee implements Interceptable {
> > private String name;
> > private transient int setCount; public String
> > getName() {
> > return (String)interceptor.getField(this, "name",
> > name);
> > }
> > public void setName(String name) {
> > setCount++;
> > this.name = (String)interceptor.setField(this,
> > "name", this.name, name); // edge case
> > assert ((this.name =
> > (String)interceptor.setField(this, "name", this.name,
> > (String)interceptor.getField(this, "name",
> > this.name))) ==
> > (String)interceptor.getField(this, "name",
> > this.name));
> > } // implement hook
> > public void setInterceptor(Interceptor interceptor) {
> > this.interceptor = interceptor == null ?
> > Passthrough.DEFAULT : interceptor;
> > }
> > public Interceptor getInterceptor() {
> > return interceptor;
> > } private Interceptor interceptor =
> > Passthrough.DEFAULT;}Passthrough/Interceptor: public class
> > Passthrough implements Interceptor { public static final
> > Interceptor DEFAULT = new Passthrough(); public Object
> > getField(Object obj, String field, Object currentValue) {
> > return currentValue;
> > } public Object setField(Object obj, String field,
> > Object currentValue, Object newValue) {
> > return newValue;
> > }
> > }Thanks...
> >
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> http://dev.eclipse.org/mailman/listinfo/aspectj-users