I guess I agree with you for the most part. Thing is, for all this talk about how "it's all fixable" no one actually done so... I don't recall hearing of a single project that tried to improve the situation. I might sound silly saying this... but it really ticks me off. I hate using APIs that force no-op constructors and inappropriate method accessibility on me. CGLIB acts more like a framework than a library in the sense that it forces its bad design on you :( Anyway, end of rant. I'll be happy when I can avoid CGLIB altogether in Guice.
Gili Stuart McCulloch wrote: > 2008/11/26 Gili Tzabari <[EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]>> > > > Stuart McCulloch wrote: > > it's the eager proxying that I'm worried about - could get hairy > > > > for example: how do I tell Guice about the class that should be > proxied > > without actually loading that class (as Guice works primarily on > types) > > Alternatively you could register the Guice classloader > eagerly and > ensure that any types you refer to beyond that point would go through it > (by setting it as the Thread context CL for example). Any class injected > by Guice would automatically use the right CL. The only problem would > come from any classes loaded before the registration of the Guice CL. > Though, I suspect you should be able to do this very early on in > most cases. > > > so essentially with this technique we'd be limiting how you could use Guice? > > sorry, but personally it sounds that this introduces problems for 90% of > users > while (possibly) fixing an issue that affects 10% at most - as Java > developers > we use sub-classing all over the place, why not use it when proxying? > > the issues about serialization and default constructors are solvable without > redefining the original class - and I suspect you'd also run into > serialization > issues even when using class redefinition, as any method interception could > distribute the state to fields in objects unknown to the original class > > [FYI, setting the TCCL doesn't work for legacy code that uses Class.forName] > > > however, two classes of the same name defined by two different > loaders > > are distinct and incompatible (!A.equals(A')) which is the > problem I have > > with redefining the class at runtime - as Johan says, it has to > go into a > > separate classloader, unless you use an instrumentation agent > > I believe instrumentation agent wouldn't work in the context > of a web > container since you don't want to affect classes outside your webapp. > > > exactly, so you have to use a separate classloader and deal with > visibility issues > > > there are also visibility limitations - if I have non-public > classes A and B > > in the same package "foo" then they can only see each other if > they're > > loaded by the same classloader (delegation doesn't help here) > > Agreed, but I assume that if you're going to inject one class > in a > package you're likely going to use injection for the rest of them too > (or load them from classes that *have* been injected). > > > and what happens if I (as a user of Guice) don't want to inject every > class from a > package? Even in the general case, how do I pass Guice a module with > bindings > for a package without loading that package first? > > I guess you'd have to ensure Guice was at the top of the classloader > chain, and > have some way of marking classes you wanted redefined early on - but > you'd be > limiting how people could use Guice (ie. no use as a bundle, no way to > upgrade > without restarting the process) - all to fix some issues which can be > fixed using > normal sub-classing (as I think javassist shows) > > Gili > > > -- > Cheers, Stuart > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "google-guice" group. To post to this group, send email to google-guice@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/google-guice?hl=en -~----------~----~----~----~------~----~------~--~---