[ 
https://issues.apache.org/jira/browse/UIMA-5038?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15668628#comment-15668628
 ] 

Marshall Schor commented on UIMA-5038:
--------------------------------------

Some refactoring was done to use common code for loading.  I didn't change it 
to use loadClass - it still uses Class.forName, because of reading there's 
perhaps some other mysterious edge cases if you don't use the forName style.

If a OSGi user complains, we may revisit.

> UV3 refactor class loading for consistency / maintainability
> ------------------------------------------------------------
>
>                 Key: UIMA-5038
>                 URL: https://issues.apache.org/jira/browse/UIMA-5038
>             Project: UIMA
>          Issue Type: Improvement
>          Components: Core Java Framework
>            Reporter: Marshall Schor
>            Priority: Trivial
>             Fix For: 3.0.0SDKexp
>
>
> There are 4 main places the UIMA framework loads classes: the Framework 
> itself at startup, Resources, Annotators (a kind of resource) and JCas 
> Classes.  The last 3 can make use of UIMA extension class loaders, or PEAR 
> isolation class loaders.
> Refactor the code to have these where possible use common code.
> One issue to confirm: the current code uses 2 methods for loading classes:
> Class.forName and classloader.loadClass.  The Class.forName has a variant 
> which takes 3 arguments, making it functionally equivalent to the loadClass.  
> But its operation is subtly different in that it caches the reference to the 
> loaded class, *even if it isn't the defining class loader*, whereas loadClass 
> doesn't do this.  See 
> http://blog.bjhargrave.com/2007/09/classforname-caches-defined-class-in.html 
> for a discussion of this, and the comments for a reply from Oracle tech 
> support saying:
> bq. Applications should basically never call Classloader.loadClass(). It may 
> appear to work but it is often subtly wrong, can be a source of latent bugs, 
> and is almost never the best choice. They should instead call Class.forName() 
> using the 3 parameter version that takes a specific Classloader instance.
> Our current code always (I think) uses Class.forName for the case where there 
> is no UIMA class loader, and loadClass otherwise.  I think this would cause 
> failures in an OSGi loading scenario, where one of the parent loaders was an 
> OSGi loader and it dynamically switched its "parent".  The expectation would 
> be that the child loader (the UIMA class loader), the next time it was called 
> to load something *not* in its set of classes, would delegate to the parent 
> chain and the OSGi loader would now load from whatever was it's current 
> "parent".  But instead, because the UIMA loader would have "cached" the 
> class, it would instead be stuck getting the old class forever (unless the 
> old class was eventually GC'd)  
> Therefore, I think to work properly in this scenario, we must always use 
> loadClass, and never Class.forName.  
> The one known issue of loading named arrays doesn't arise in our case, unless 
> from some highly usual user code, and we can catch this and use Class.forName 
> in this instance.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to