[CONTAINER-181] org.seasar.framework.util.ClassUtil.forName(String)クラス読み込む処理を Class#forName() から ClassLoader#loadClass() に変更してほしい Created: 2008-03-31 Updated: 2008-07-04 Resolved: 2008-07-04 |
|
Status: | Resolved |
Project: | S2Container |
Component/s: | S2Container |
Affects Version/s: | 2.4.24 |
Fix Version/s: | None |
Type: | Bug | Priority: | Major |
Reporter: | Feng Dihai | Assignee: | koichik |
Resolution: | Won't Fix | Votes: | 0 |
Labels: | None | ||
Environment: |
Windows Vista |
Description |
https://www.seasar.org/issues/browse/CONTAINER-175と同様、修正してほしい。 |
Comments |
Comment by koichik [ 2008-07-04 ] |
確認の報告がないので対応しないことにします. |
Comment by koichik [ 2008-04-01 ] |
ComponentTagHandler.start(TagHandlerContext, Attributes) のみ修正しました. http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-framework/2.4.25-SNAPSHOT/s2-framework-2.4.25-20080401.092235-2.jar SVN リポジトリにはコミットしていません. なお,ClassUtil#forName() では,Class#forName(String) ではなく,Class#forName(String, boolean, ClassLoader) を使用し,第 3 引数にはコンテキストクラスローダを渡しています. Loading Constraints の問題については,ロードするクラス名とロードされるクラス名が異なるような特殊な状況でのみ,問題になると考えています.このような状況は通常発生しないため,注意を喚起する必要はないと思います. |
Comment by Feng Dihai [ 2008-04-01 ] |
ご返答をありがとうございます。変更を受け入れない理由を承知いたしました。 Eclipseサーチ機能を利用して、s2-extension, s2-framework及びs2-tigerからClassUtil#forName()の呼び出しは15箇所を見つかりました(以下参照)。すべて変更の必要があるかどうか、ご判断をお願いいたします。 s2-framework-2.4.24.jar - org.seasar.framework.container.cooldeploy.CoolComponentAutoRegister.processClass(String, String) s2-framework-2.4.24.jar - org.seasar.framework.container.factory.AbstractAnnotationHandler.createComponentDef(String, InstanceDef, AutoBindingDef, boolean) s2-framework-2.4.24.jar - org.seasar.framework.container.factory.AbstractAnnotationHandler.createComponentDef(String, InstanceDef, AutoBindingDef) s2-framework-2.4.24.jar - org.seasar.framework.container.factory.AbstractAnnotationHandler.createComponentDef(String, InstanceDef) s2-framework-2.4.24.jar - org.seasar.framework.container.factory.AnnotationHandlerFactory.initialize() s2-framework-2.4.24.jar - org.seasar.framework.container.factory.ComponentTagHandler.start(TagHandlerContext, Attributes) s2-framework-2.4.24.jar - org.seasar.framework.convention.impl.NamingConventionImpl.findClass(String, String, String) (2 matches) s2-framework-2.4.24.jar - org.seasar.framework.convention.impl.NamingConventionImpl.isSkipClass(Class) s2-framework-2.4.24.jar - org.seasar.framework.convention.impl.NamingConventionImpl.toCompleteClass(Class) s2-framework-2.4.24.jar - org.seasar.framework.util.ClassUtil.newInstance(String) s2-framework-2.4.24.jar - org.seasar.framework.util.DriverManagerUtil.registerDriver(String) s2-extension-2.4.24.jar - org.seasar.extension.component.impl.ComponentInvokerCreator.createComponentDef(Class) s2-extension-2.4.24.jar - org.seasar.extension.component.impl.ComponentInvokerCreator.createComponentDef(String) s2-extension-2.4.24.jar - org.seasar.extension.dxo.annotation.impl.AnnotationReaderFactoryImpl.AnnotationReaderFactoryImpl(S2Container) Seasar2 Container以外のプロジェクトにもClassUtil#forName(String)あるいは直接にClass#forName()が使われています。しかし、Class#forName() はダイナミック・クラス・ロードの時、潜在的に存在するはずのクラスをロード失敗することがあるので、ぜひ対策を講じてほしい(開発者に注意喚起とか)。あらためて参考資料を添付いたします。 理由:Class.forName(..)では余分のクラス検証処理がかかりますので、うまくショット・クラス名を解決できません。 参考資料: [http://www.javageeks.com/Papers/ClassForName/ClassForName.pdf] [http://blog.bjhargrave.com/2007/07/why-do-classforname-and.html] |
Comment by koichik [ 2008-04-01 ] |
ClassUtil#forName() は Class#forName() をラップしたものです.その中で ClassLoader#loadClas() を呼び出すのはクラス/メソッドの名前と内容が一致しないので,この変更は受け入れられません. 変更するなら ClassUtil#forName() を呼び出している場所を ClassLoaderUtil#loadClass() を呼び出すようにするのが妥当ですが,変更箇所が多いのが問題です. |