>I imagine we could make the 'fetching of classes' a
pluggable thing so
> if you have another strategy for getting hold of
them, you could
> supply it. Possibly another method on the
weaving context (that you
> could override in your
MonitorWeavingContext). You should raise an
> enhancement request
for this change.
>
> Andy
>
> On 2 June 2010 06:32,
"C. Knappe (GSD)" <
cknappe@xxxxxxxxxxxxxxxx>
wrote:
> >
> > Hello,
> >
> > I am working
on a custom class loading system which gets classes from a database. Before
defining the classes in this loader I use a ClassLoaderWeavingAdaptor.
>
>
> > I do:
> >
> >
ClassLoaderWeavingAdaptor clwa = new
ClassLoaderWeavingAdaptor();
> >
clwa.initialize(this, new MonitorWeavingContext(this)); // this is the
database class loader instance
> >
> >
> > The
WeavingContext looks like this..
> >
> >
private class MonitorWeavingContext extends DefaultWeavingContext
{
> >
> >
private ClassLoader loader;
> >
> >
public
MonitorWeavingContext(ClassLoader loader) {
> >
super(loader);
> >
this.loader = loader;
> >
}
> >
>
> @Override
>
> public
List<Definition> getDefinitions(ClassLoader loader, WeavingAdaptor
adaptor) {
> >
System.out.println("CALLED getDefinitions
for " + loader);
> >
List<Definition> definitions = new
ArrayList<Definition>();
> >
Definition d = new
Definition();
> >
d.getAspectClassNames().add("com.gsdsoftware.sys.AppStateWriter");
>
>
d.appendWeaverOptions("-Xjoinpoints:synchronization");
>
> //
d.appendWeaverOptions("-debug");
> > //
d.appendWeaverOptions("-verbose");
> >
d.appendWeaverOptions("-showWeaveInfo");
> >
definitions.add(d);
> >
return definitions;
>
> }
>
>
> >
@Override
> >
public String getClassLoaderName(){
> >
System.out.println("getClassLoaderName");
> >
return
this.loader.getClass().getName();
> >
}
> >
> >
@Override
> >
public ClassLoader getClassLoader(){
>
>
System.out.println("getClassLoader...");
> >
return this.loader;
> >
}
> > }
>
>
> >
> > after having initialized the Adaptor I
call:
> >
> >
clwa.weaveClass(name, bytes, true);
> >
> > The
problem is, that in the weaving process some classes are needed which comes
also from database.
> >
> > I changed the private method
lookupJavaClass(ClassPathManager classPath, String name) in BcelWorld java
file.
> > In my case the ClassPathManager is null and the delegate
(Repository) does not find the class.
> > So after the
ClassNotFoundException is throw by Repository.loadClass(name) I added code to
get JavaClass from database.
> >
> > Code block looks like
this:
> >
> >
if (classPath == null) {
> >
try {
>
>
> >
ensureRepositorySetup();
> >
JavaClass jc = delegate.loadClass(name);
> >
if (trace.isTraceEnabled()) {
> >
trace.event("lookupJavaClass",
this, new Object[] { name, jc });
> >
}
> >
return jc;
> >
} catch (ClassNotFoundException e) {
> >
> >
// cknappe
> >
JavaClass jc = null;
> >
DBLoader myLoader = (DBLoader) this.loaderRef.getClassLoader();
>
>
> >
ClassParser parser =
new ClassParser(myLoader.getResourceAsStream(name), name);
> >
try {
> >
jc = parser.parse();
> >
return jc;
> >
} catch (ClassFormatException cfex)
{
> >
> >
} catch
(IOException ioex) {
> >
> >
}
> >
// cknappe
>
>
> >
if
(trace.isTraceEnabled()) {
> >
trace.error("Unable to find class '" + name + "' in
repository", e);
> >
}
> >
return null;
> >
}
>
> }
>
>
> > This works fine for me but I wonder if there should not be
an other way to get this thing work without changing aspectj code.
>
>
> > Thanks a lot for your replies.
> >
_______________________________________________
> > aspectj-dev
mailing list
> >
aspectj-dev@xxxxxxxxxxx> >
https://dev.eclipse.org/mailman/listinfo/aspectj-dev>
>
> _______________________________________________
>
aspectj-dev mailing list
>
aspectj-dev@xxxxxxxxxxx>
https://dev.eclipse.org/mailman/listinfo/aspectj-dev_______________________________________________
aspectj-dev
mailing list
aspectj-dev@xxxxxxxxxxxhttps://dev.eclipse.org/mailman/listinfo/aspectj-dev