[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
JDK1.5.0_14



 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) のみ修正しました.
2.4.25-SNAPSHOT をデプロイしたのでご確認ください.

http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-framework/2.4.25-SNAPSHOT/s2-framework-2.4.25-20080401.092235-2.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-extension/2.4.25-SNAPSHOT/s2-extension-2.4.25-20080401.092235-1.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-tiger/2.4.25-SNAPSHOT/s2-tiger-2.4.25-20080401.093027-1.jar

SVN リポジトリにはコミットしていません.
確認の報告があり次第コミットします.
報告をいただけない場合,リリースには含まれません.

なお,ClassUtil#forName() では,Class#forName(String) ではなく,Class#forName(String, boolean, ClassLoader) を使用し,第 3 引数にはコンテキストクラスローダを渡しています.
そのため,ClassForName.pdf の問題は発生しないと考えています.

Loading Constraints の問題については,ロードするクラス名とロードされるクラス名が異なるような特殊な状況でのみ,問題になると考えています.このような状況は通常発生しないため,注意を喚起する必要はないと思います.

Comment by Feng Dihai [ 2008-04-01 ]

ご返答をありがとうございます。変更を受け入れない理由を承知いたしました。

Eclipseサーチ機能を利用して、s2-extension, s2-framework及びs2-tigerからClassUtil#forName()の呼び出しは15箇所を見つかりました(以下参照)。すべて変更の必要があるかどうか、ご判断をお願いいたします。
org.seasar.framework.container.factory.ComponentTagHandler.start(TagHandlerContext, Attributes)」だけでもClassLoader#loadClas() に変更していただければ、うれしいです(CONTAINER-175のパッチを作るため)。

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() を呼び出すようにするのが妥当ですが,変更箇所が多いのが問題です.
変更が必要な箇所が特定できるなら対応を検討します.

Generated at Thu Apr 25 17:06:40 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.